Unity/Study

유니티 Input System을 활용한 캐릭터 이동 구현

홍삼맛 2023. 11. 24. 20:54

📌 캐릭터 이동 구현

  • 탑다운 시점으로 캐릭터 이동을 구현한다.
  • W,A,S,D 조작으로 xy축 방향으로 자유롭게 이동한다.

 

📌 구현 목록

📄 PlayerMove.cs

private float speed = 5.0f;

void Update()
{
    float x = Input.GetAxis("Horizontal");
    float y = Input.GetAxis("Vertical");
    
    transform.position += new Vector(x, y) * speed * Time.deltaTime;
}
  • 기본적인 유니티 캐릭터 움직임 코드
  • 그러나 게임 볼륨이 커질수록 이걸 효율적으로 관리할 수 있는 기능이 필요하다.

📄 TopDownCharacterController.cs

public event Action<Vector2> OnMoveEvent;
public event Action<Vector2> OnLookEvent;

// 움직이는 이벤트
public void CallMoveEvent(Vector2 direction)
{
    OnMoveEvent?.Invoke(direction);
}

// 바라보는 이벤트
public void CallLookEvent(Vector2 direction)
{
    OnLookEvent?.Invoke(direction);
}
  • 플레이어의 Input에 따라 발동시키는 이벤트를 생성
  • Vector2 값이 주어졌을때, 그 값에 따라 움직이거나 바라보는 기능을 호출할 수 있다.

🔧 Unity: Input System

 

Unity의 기능 Input System

  • 패키지 매니저에서  InputSystem을 다운 받고, TopDownController2D로 지은 InputSystem을 하나 생성한다.
  • 상단의 사진처럼 Move, Look, Fire 등 여러 상황에 대한 조작을 추가해서 기준을 만들어 둔다.

📄 PlayerInputController.cs

public class PlayerInputController : TopDownCharacterController
{
    private Camera _camera;

    private void Awake()
    {
        _camera = Camera.main;
    }

    public void OnMove(InputValue value)
    {
        Vector2 moveInput = value.Get<Vector2>().normalized; 	// 대각선 이동도 고정
        CallMoveEvent(moveInput);
    }
}
  • PlayerInputController에서 입력처리 기능을 구현
  • OnMove 매서드에서 InputSystem에 주어진 키 조작값에 따라 InputValue를 Vector2로 변환한 다음, 상속 받은 CallMoveEvent에 moveInput 값을 대입

📄 TopDownMovement.cs

public class TopDownMovement : MonoBehaviour
{
    [SerializeField] private float speed = 4.0f;

    private TopDownCharacterController _controller;
    private Vector2 _movementDirection = Vector2.zero;
    private Rigidbody2D _rigidbody;

    private void Awake()
    {
        _controller = GetComponent<TopDownCharacterController>();
        _rigidbody = GetComponent<Rigidbody2D>();
    }

    private void Start()
    {
        _controller.OnMoveEvent += Move;
    }

    private void FixedUpdate()
    {
        ApplyMovement(_movementDirection);
    }

    private void Move(Vector2 direction)
    {
        _movementDirection = direction;
    }

    private void ApplyMovement(Vector2 direction)
    {
        direction *= speed;
        _rigidbody.velocity = direction;
    }
}
  • 플레이어 실제 움직임을 표현 하는 클래스

Player의 컴포넌트

 

💡 결과 화면

플레이어의 움직임