Unity

New InputSystem을 사용해 캐릭터 이동 구현 방법

CommitGuy 2025. 2. 11. 22:26

이번 포스팅에서는 Unity의 New InputSystem을 사용하여 플레이어를 이동하는 방법을 소개해보도록 하겠습니다

아래 영상은 구현했을때의 모습입니다.

움직이는 코드.MP4
1.80MB

 

New Inputsystem을 사용해 플레이어를 이동하는 코드를 만들어 보겠습니다 

우선 New InputSystem 구조입니다.

NewInputSystem 구조

Actions Properties에 Move 변수를 만들고 Action Type을 Value로 Control Type은 Vector2로 구성.

해당 Action Properties에 WASD라는 Binding Properties를 생성, Composite Type은 2D Vector, Mode는 Digital로 구성합니다.

그리고 그 아래로 W, A, S, D 변수들을 바인딩합니다.

 

InputSystem에서 Generate C# Class를 클릭하여 C# 코드를 생성합니다.

 

(InputSystem을 사용하는 방법에는 여러가지가 있는데 저의 경우 C# 코드로 생성해서 사용하는것을 좋아하여 C# 코드를 생성합니다)

 

해당 InputSystem을 사용하는 코드를 작성합니다

GameInput.cs]

using UnityEngine;

public class GameInput : MonoBehaviour
{
    private StarterAssetsInputSystem playerInputActions;


    private void Awake()
    {
        playerInputActions = new StarterAssetsInputSystem();
        playerInputActions.Player.Enable();
    }

    public Vector2 GetMovementVectorNormalized()
    {
        Vector2 inputVector = playerInputActions.Player.Move.ReadValue<Vector2>();
        inputVector = inputVector.normalized;

        return inputVector;
    }
}

생성된 C# 코드인 StarterAssetsInputSystem의 인스턴스를 생성하고 해당 InputSystemd의 Action Maps인 Player를 활성화해줍니다(Enable())

 

GetMovementVectorNormalized() 함수를 보면 Move Action Properties를 가져와 정규화(normalized) 시킨후 return 합니다.

 

이제 실제 캐릭터를 이동하는 코드를 작성해보겠습니다

CharacterController.cs]

using UnityEngine;

namespace SmalVillage
{
    public class CharacterController : MonoBehaviour
    {
        [SerializeField] private GameInput gameInput;
        [SerializeField] private float moveSpeed = 7f;

        private bool isWalking = false;


        private void Update()
        {
            HandleMovement();
        }

        private void HandleMovement()
        {
            Vector2 inputVector = gameInput.GetMovementVectorNormalized();

            Vector3 moveDir = new Vector3(inputVector.x, 0f, inputVector.y);


            float moveDistance = moveSpeed * Time.deltaTime;
            transform.position += moveDir * moveDistance;

            // Vector3.zero가 아니면 움직이는 상태 
            isWalking = moveDir != Vector3.zero;

            if (moveDir != Vector3.zero)
            {
                float rotateSpeed = 10f;
                transform.forward = Vector3.Slerp(transform.forward, moveDir, Time.deltaTime * 10f);
            }
        }
    }
}

 

앞서 만든 gameInput 클래스의 GetMovementVectorNormalized() 함수를 호출해 값을 가져온 후 캐릭터의 position 값을 바꿔주고 움직임에 따라 캐릭터에게 회전을 주기 위해 transform.forward 값을 변경해줍니다.

 

이렇게 해주면 캐릭터가 이동되어 집니다

반응형