[Unity] New Input System 으로 플레이어 움직이기
1. New Input System
2. New Input System 사용방법
3. PlayerController 스크립트
4. PlayerInput 컴포넌트
📝 New Input System이란?
Unity에서 2019 버전부터 새로 만든 Input 시스템
🔖 기존 Input System과 다른 점
기존의 Input시스템에는 Axes를 추가하고, 스크립트를 작성할 때 Update에서 계속 GetKeyDown으로 검사해줘야 한다.
또한 플랫폼별 입력 대응이 어렵다는 한계가 있다.
🔖 New Input System의 장점
1. 키보드, 컨트롤러 등의 여러 플랫폼에 쉽게 대응할 수 있다.
2. 하나의 코드를 통해 다양한 플랫폼에서의 입력 처리 가능
3. 입력 Action에 대한 함수를 직관적이고 간편하게 연결할 수 있다
기존 방식의 한계
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
}
New Input System의 함수 연결
void OnJump(InputAction.CallbackContext context)
{
Jump();
}
□ 코드 가독성이 향상됨
□ 입력 관리를 효율적으로 관리할 수 있다
📝 New Input System 사용
1. Package Manger의 InputSystem을 다운로드한다
2. Edit → Project Setting → Player → ActiveInputHandiling에서 사용할 Input System을 설정할 수 있다.
Input System Package(New)를 클릭하면 경고창이 뜨는데 Apply를 누른 후 유니티프로젝트를 재실행한다.
3. Create → Input Action을 생성한다. 이름은 PlayerInput으로 설정한다.
4. 생성 후 Inspector 창에서 Edit Asset을 클릭한다
5. InputAction 창이 뜨면 왼쪽 상단에 Scema를 설정해 준다.
🔖 Control Scheme (컨트롤 스키마)
: 특정 플랫폼에서 사용할 입력 설정의 그룹
: 예시
: 키보드 + 게임패드 스키마
: 키보드 + 마우스 스키마
: 플랫폼별 입력 대응을 할 수 있는 부분
🔖 Action Maps (액션 맵)
: 사용할 키 입력에 대한 Action들을 그룹화
🔖 Actions (액션)
: 특정 입력에 대한 입력 동작
: Started , Performed, Cancled등 다양한 입력상태 처리 가능
6. Actions 추가
플레이어 움직임 입력을 위한 Action을 추가한다.
Action Type은 Value / ControlType은 Vector2로 설정한다
🔖 Action Type
버튼 : 단일성으로 누르고 떼는 용도
Value : 지속적으로 값을 변화하고자 할 때
6-1. Move Action옆의 + 버튼을 누른 후 "Add Up ~ Composite"를 클릭한다
Up / Down / Left / Right에 해당하는 키를 바인딩해준다. 각각 w s a d로 바인딩해주었다.
7. 다른 행동에 대한 Action을 추가해 준다
□ 마우스 움직임에 따른 카메라 회전 입력을 위해서 Look이라는 Action을 추가한다
■ Action Type은 Value / ControlType은 Delta / Binding path는 Delta[Mouse]로 바인딩해준다
□ 점프, 인벤토리, 상호작용 입력을 위한 Jump , Inventory, Interaction이라는 Action을 추가한다
■ 각각 Action Type은 Button / Binding path는 Backspace, Tab , E [Keyboard]로 바인딩해준다
□ 공격키 입력을 위한 Attack이라는 Action을 추가한다
■ Action Type은 Value / Binding path는 Left Button [Mouse]로 바인딩해준다
📝PlayerController 스크립트
public class PlayerController : MonoBehaviour
{
[Header("===Movement==")]
private float _moveSpeed = 3f;
private Vector2 curMoveInput;
private void
FixedUpdate()
{
Move();
}
private void Move()
{
Vector3 dir = transform.forward * curMoveInput.y + transform.right * curMoveInput.x;
dir *= _moveSpeed;
dir.y = playerRB.velocity.y;
playerRB.velocity = dir;
}
public void OnMove(InputAction.CallbackContext context)
{
// 입력이 있으면 받아오기
if (context.phase == InputActionPhase.Performed)
{
curMoveInput = context.ReadValue<Vector2>();
}
// 입력이 없으면 0,0 으로
else if (context.phase == InputActionPhase.Canceled)
{
curMoveInput = Vector2.zero;
}
}
}
□ OnMove()
■ PlayInput컴포넌트에서 입력 발생 시 리턴되는 콜백을 받아오기 위한 함수 작성
■ 매개변수를 InputAction.CallbackContext로 콜백을 받아온다
■ 현재 움직임에 대한 Vector2 타입의 curMoveInput 값을 들어온 콜백의 Vector2로 설정한다
□ Move()
■ 받아온 curMoveInput을 사용하여 플레이어 움직임을 제어한다
🔖InputActionPhase.Performed
: 콜백이 발생하는 동안
🔖InputActionPhase.Started
: 콜백이 발생할 때, 1회
🔖InputActionPhase.Canceled
: 콜백이 종료될 때 , 1회
📝 PlayerInput 컴포넌트
플레이어 오브젝트를 만든 후 PlayerController스크립트와 Player Input 컴포넌트를 추가해 준다
Acions에 방금 만든 PlayerInput을 추가해 준다
Behavior도 Invoke Unity Events로 설정한다
🔖 Invoke Unity Events
: 유저가 정의한 Action에 대한 키 입력이 들어오면 , 설정한 이벤트 (함수)가 실행된다
컴포넌트의 Event → Player → Move Aciont에 (+) 버튼으로 추가해 준다
Player 오브젝트를 드래그해서 넣고, PlayerController스크립트의 OnMove메서드를 추가한다
📝 결과
: wsad가 입력되면 플레이어가 움직이는 것을 확인할 수 있다.