유니티의 Input System을 사용해서 이동을 구현해볼 예정이다.
이전에 정리한 적이 있지만 이번에는 그때와 다르게 Send Massage와 다른 Invoke Unity Events를 사용해서 구현할 예정이다.
두 방식 모두 사용자의 입력을 처리하는데 사용된다는 것에서 동일하지만 다음과 같은 차이점이 있다.
위 차이점을 보면 비슷한 기능을 하고 있지만 다른 방식으로 작동하는 것을 알 수 있다. 객체 지향 프로그래밍에서는 결합도를 낮추고 응집도를 높이는게 중요한데 결합도가 높은 Send Massage보다 결합도가 낮은 Invoke Unity Events를 사용하는게 더 좋아보인다.
void OnMove(InputValue value)
{
Vector2 movement = value.Get<Vector2>();
// 이동 로직 처리
}
public void OnMove(InputAction.CallbackContext context)
{
if(context.phase == InputActionPhase.Performed)
{
curMovementInput = context.ReadValue<Vector2>();
}
else if (context.phase == InputActionPhase.Canceled)
{
curMovementInput = Vector2.zero;
}
}
작동 방식도 다른 만큼 Send Massage 방식과 코드의 작성 방식도 차이가 있다. InputAction.CallbackContext context
는 유니티에서 입력 이벤트가 발생할 때 이벤트에 대한 정보를 제공하는 역할을 한다. 특정 액션 입력과 관련된 데이터를 캡슐화해 입력 이벤트에서 어떤 입력인지 어떤 상태인지 등을 알려준다.
입력 값을 읽거나, context.phase
에서 Performed
, Canceled
와 같이 입력의 현재 상태를 확인하는 식으로 이동의 입력 여부를 확인해 넘겨주는 방식이다.
또 Send Massage와 다르게 유니티 인스펙터 창에서 또 추가해줄 것이 있다.
버튼에서 이벤트를 추가해주는 것 처럼 인스펙터에서도 추가해줘야 한다. Send Massage와의 차이점으로 비 프로그래머들도 쉽게 확인이 가능하다는 특징 또한 가지고 있다.
아직 플레이어의 이동 부분에만 적용해 Send Massage를 사용했을 때와의 이점을 크게 체감하지 못했다. 아마 추가적으로 이동이 필요한 오브젝트가 추가 되었을 때 편의성의 차이를 체감할 수 있을 것 같다.
앞서 Send Massage에서 코드로 작성할 때는 이동이 필요할 때마다 함수를 추가해주거나 스크립트를 넣는식으로 했는데, 이걸로 추가적인 코드 없이 실행가능 하게끔 생각해봐야겠다.