지금까지 캐릭터의 이동구현을 스크립트로만 처리를 해주었는데 강의를 들으면서 Input System이라는 것을 처음 사용해보니 잘 이해가 가지 않아 튜터님에게도 가서 설명을 듣고 왔어요.
그래서 오늘 Input System에 대해 알게 된 것을 정리해보겠습니다.
Input System은 기존의 Unity에 내장되어 있는 입력 관리 시스템으로는 많은 플랫폼과 기기를 지원하기에 어려움이 많아 기존의 Input Manager를 대체해 새롭게 구축한 입력 시스템이에요.
패키지 매니저에서 Input System을 인스톨 하여 사용할 수 있습니다.

Input Action을 생성하면 다음과 같은 창이 떠요

이곳에서 실행할 Action, Action을 실행시킬 입력 값을 설정해줍니다.
그리고 Player 오브젝트에 Player Input 컴포넌트를 추가해주고 만들었던 Input Action을 넣어줍니다.

Behavior가 Send Message로 설정되어 있는데 이건 Action이 실행되면 해당 오브젝트의 컴포넌트에게 메시지 함수를 호출시켜주는데 Behavior 아래 보이는 함수들을 호출해줍니다.
이제 스크립트를 만들어 줄거에요.
public class TopDownController : MonoBehaviour
{
public event Action<Vector2> OnMoveEvent; // Action은 무조건 void만 반환해야 함 아니면 Func
public void CallMoveEvent(Vector2 direction)
{
OnMoveEvent?.Invoke(direction);
}
}
이 스크립트에서는 Action이 발생했을때 이벤트를 호출해주는 역할을 할거에요.
플레이어와 몬스터의 이동이 다르기 때문에 이 스크립트를 상속해서 각각 구현하기 위해 만든 스크립트입니다.
public class PlayerInputController : TopDownController
{
public void OnMove(InputValue value)
{
Vector2 moveInput = value.Get<Vector2>().normalized;
CallMoveEvent(moveInput);
}
}
아까 Player Input에서 봤던 OnMove 함수에요.
Action이 발생하면 호출되는데 입력받은 키의 값을 정규화 해주고 컨트롤러의 이벤트 호출 함수를 호출해요.
public class TopDownMoveMent : MonoBehaviour
{
// 실제로 이동이 일어날 컴포넌트
private TopDownController controller;
private Rigidbody2D movementRigidbody;
private Vector2 movementDirection = Vector2.zero;
private void Awake()
{
controller = GetComponent<TopDownController>();
movementRigidbody = GetComponent<Rigidbody2D>();
}
private void Start()
{
controller.OnMoveEvent += Move;
}
private void Move(Vector2 direction)
{
movementDirection = direction;
}
private void FixedUpdate()
{
// FixedUpdate는 물리업데이트 관련
// rigidbodyd의 값을 바꾸니까 fixedUpdate
ApplyMovement(movementDirection);
}
private void ApplyMovement(Vector2 direction)
{
direction = direction * 5;
movementRigidbody.velocity = direction;
}
}
실제로 이동이 발생하는 스크립트 입니다.
전체적인 흐름을 보면 Player Input 컴포넌트에 넣어준 TopDownController2D 에서 설정해준 Action이 실행되면 Behavior의 아래에서 보이는 함수들을 호출해 줍니다.
PlayerInputController 스크립트의 OnMove() -> TopDownController 스크립트의 CallMoveEvent() -> TopDownMoveMent 스크립트의 Move() 순으로 호출되어moveDirection 값을 받아 이동처리를 해줍니다.
처음 사용해보는 기능이라 동작 흐름이 처음에 이해가 잘 가지 않았었는데 설명을 잘 못한거 같긴 하지만 지금은 어떻게 돌아가는 건지 알게 되었어요.
여러 플랫폼과 기기들을 지원하기 위해서 앞으로 계속 사용해보면서 더 자세하게 알아보도록 노력해봐야 겠어요.