기존의 코드에서는
Update 함수를 통해 매 프레임마다 입력 이벤트를 처리하였다.
void Update() { inputVec.x = Input.GetAxisRaw("Horizontal"); inputVec.y = Input.GetAxisRaw("Vertical"); }
다음은 이를 새로운 인풋시스템으로 대체하는 과정이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
public Vector2 inputVec;
public float speed;
Rigidbody2D rigid;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
}
void FixedUpdate()
{
Vector2 nextVec = inputVec * speed * Time.fixedDeltaTime;
rigid.MovePosition(rigid.position + nextVec);
}
void OnMove(InputValue value)
{
inputVec = value.Get<Vector2>();
}
}
using UnityEngine.InputSystem;
새로운 네임스페이스를 사용한다. 새로운 인풋 시스템인 OnMove 함수가 포함되어 있다.
이벤트 기반의 콜백 함수이다.
(= 특정 이벤트가 발생할 때마다 호출되는 함수이다.)
이 코드에서는 '사용자의 입력이 있을 때' 호출된다.
void OnMove(InputValue value) { inputVec = value.Get<Vector2>(); }
value 매개변수를 통해 입력 데이터를 받아, value.Get<Vector2>()를 사용하여 이를 Vector2 형태로 변환한 뒤 inputVec에 저장한다.
이벤트 기반 처리
OnMove는 이벤트 기반의 접근 방식을 사용하여 입력을 처리한다. 즉, 사용자의 입력이 있을 때만 함수가 호출된다. 이는 불필요한 입력 체크를 줄이고, 성능상의 이점을 가져올 수 있다.
비동기적 입력 반응
입력 이벤트가 발생할 때마다 OnMove가 즉시 호출되므로, 사용자의 입력에 대한 반응이 더 신속하고 정확해진다. Update에서의 폴링(polling) 방식은 현재 프레임에서의 입력 상태만을 체크하므로, 빠른 입력 변화를 놓칠 수 있다.
코드의 명확성과 관리 용이성
OnMove 함수는 이름에서부터 입력 처리의 목적이 명확하게 드러난다. 이는 코드의 가독성을 높이고, 특정 입력 이벤트에 대한 로직을 쉽게 찾고 관리할 수 있게 한다.
유연한 입력 처리
새로운 입력 시스템인 OnMove는 다양한 유형의 입력 장치와 쉽게 통합될 수 있으며, 같은 액션에 대해 여러 입력 소스를 매핑할 수 있다. 이는 다양한 플랫폼과 입력 장치에 대응하는 게임을 개발하는 데 유용하다. 또한 커스터마이즈와 확장성 면에서 뛰어나, 입력 시스템을 보다 세밀하게 조정하고, 복잡한 입력 시나리오에 적응할 수 있는 방법을 제공한다.
그러나
모든 상황에서 OnMove가 기존 Update 방식보다 우월한 것은 아니다. 특정 게임이나 애플리케이션의 요구 사항에 따라 적절한 입력 처리 방식을 선택하는 것이 중요하다. 예를 들어, 매우 빠른 프레임 속도에서 연속적인 입력 변화를 실시간으로 추적해야 하는 경우에는 Update 방식이 여전히 유용할 수 있다.
void FixedUpdate() { Vector2 nextVec = inputVec * speed * Time.fixedDeltaTime; rigid.MovePosition(rigid.position + nextVec); }
inputVec.normalized에서 inputVec으로 변경되었다.
이는 Player Input 컴포넌트의 Actions를 설정하면서 Player > Move 액션의 Processors에 Normalize Vector 2 기능을 추가하여 스크립트 밖에서 Input 값을 후보정할 수 있기 때문이다.
MonoBehaviour 클래스를 상속받는 Player 클래스의 스크립트이다.
이동을 위한 방향키 입력값을 벡터로 받는 inputVec 변수, 이동 속도를 정의하는 speed 변수, Rigidbody2D 컴포넌트를 참조할 수 있는 rigid 변수를 각각 정의한다.
Awake 함수에서는 초기화를 수행한다. Player 오브젝트에 부착된 Rigidbody2D 컴포넌트를 rigid 변수가 참조하도록 한다.
OnMove 함수에서는 방향키 입력을 제어한다. value 매개변수로 입력값을 받아온 후, inputVec 변수에 벡터 형태로 변환하여 대입한다.
FixedUpdate 함수에서는 플레이어의 이동을 제어한다. 우선 Player가 현재 위치로부터 이동해야 할 벡터값을 계산한다. 이는 inputVec(을 정규화한) 값에 speed 변수의 값과 다음 FixedUpdate 호출까지의 시간 간격 값을 전부 곱한 것과 같다. 그 다음 rigid(= Player에 부착된 Rigidbody2D 컴포넌트)가 rigid의 현재 위치 + 앞에서 계산된 벡터값의 위치에 놓이도록 한다. 이를 일정한 시간 간격으로 수행한다.
출처 :
링크텍스트