본문 바로가기

유니티 6 Input System 사용하여 캐릭터 이동 추가하기

Kwon_river 2025. 3. 14.

유니티 6가 새롭게 출시되면서 Input System이 기본 내장되었는데요. 레거시 방법이라고 할 수 있는 Input Manager를 사용해도 상관은 없지만 더 편리한 관리를 위해서 Input System을 사용하는 방법을 알아보도록 하겠습니다. 이 글에서는 캐릭터 이동을 하도록 하였습니다.

 

유니티 6 Input System 추가하기

유니티 6 미만의 기존 버전에서는 인풋 시스템이 기본 설치되어 있지 않은 버전들이 있었는데요. 6으로 넘어오면서 기본적으로 내장되었습니다. 이를 확인하기 위해서는 상단에 있는 [윈도우] - [패키지 매니저]를 눌러 패키지 관리창을 열어줍니다.

 

 

Input-system-설치-상태

 

그다음 Input Manager를 검색하면 이미 설치가 되어 있는 것을 확인하실 수 있는데요. 제거하게 되면 이 시스템을 사용하지 않을 수 있습니다. 만약 기본으로 설치되어 있지 않다면 다운로드해 주면 됩니다.

 

Add-Component-Player-InputPlayer-Input

 

그다음 이동을 추가할 캐릭터 오프젝트를 선택하고 인스펙터 창에서 Add Component를 누른 뒤 Player Input을 검색하여 추가해 줍니다. 그러면 컴포넌트가 추가됩니다. 그리고 우리는 이 컴포넌트의 Actions에 주목합니다.

 

유니티 6 이전 버전에서는 Actions에 아무것도 없는 빈칸으로 되어 있었지만, 유니티 6에서는 기본으로 InputSystem_Actions가 만들어져 있습니다. 이 InputSystem_Actions를 더블 클릭하면 편집할 수 있는 화면이 나타납니다.

 

InputSystem_actions-구성-요소

 

위 창에서 액션에 따른 입력을 조정할 수 있습니다. Move 안에는 어떤 키를 입력하여 Move 액션을 동작할지 4개의 기본 처리가 되어 있습니다. 게임 패드, 키보드, VR 컨트롤러, 조이스틱이 있는데요. 특정 시스템에서만 동작하기를 원한다면 특정한 값만 남기고 모두 지워도 됩니다. 우클릭하면 Delete가 나타납니다.

 

Move를 누르면 Action Properties가 나타나고 Action Type과 Control Type이 나타납니다. 원하는 방법으로 세팅하면 되기는 하는데 유니티에서 보통 2D 게임을 만든다고 가정하면 기본값으로 해두는 것도 나쁘지 않습니다. (현재 프로젝트는 2D 기본 프로젝트)

 

그리고 Processors가 있는데요. 여기서는 Normalize Vector 2를 추가해 줍니다. 정규화를 하지 않으면 대각선 이동을 할 때 수평, 수직 이동보다 훨씬 빠른 속도로 움직이게 됩니다. 그 이유는 아래 표를 보면 알 수 있는데요.

 

액션 인풋 값 실제 이동 거리
위로 이동 (0, 1) 1
좌로 이동 (1, 0) 1
왼쪽 위 대각선 이동 (1, 1) 루트(2)

 

피타고라스 정리에 의해 X, Y 모두 1씩 이동하면 실제 이동 거리는 루트 2가 됩니다. 루트 2는 1보다 큰 값인데요. 때문에 대각선으로 이동할 때 속도가 더 빠르게 됩니다. 이를 막기 위해서 노멀라이즈를 하게 되는데요. 그러면 왼쪽 위 대각선 이동을 할 때 실제 이동 거리가 1이 되도록 변형된 값이 들어오게 됩니다.

 

원하는 값을 모두 설정했다면 왼쪽 상단에 있는 Save Asset을 눌러 수동으로 저장하거나 바로 옆에 있는 Auto-Save를 눌러서 변경된 값이 자동으로 저장되도록 해줍니다.

 

캐릭터 이동을 위한 스크립트 구현

설정이 모두 완료되었다면, 이동을 위한 스크립트로 이동합니다. 스크립트 상단에서 "using UnityEngine.InputSystem;"을 추가하고 행동에 필요한 함수들을 추가합니다. 어떤 함수를 추가해야 하는지는 위에서 설정했던 스크립트의 Behavior에서 확인하실 수 있습니다.

 

인풋-시스템-함수

 

이 글에서는 캐릭터의 이동을 할 예정이기 때문에 "void OnMove(InputValue value) 함수를 추가해 줍니다. 해당 함수에서 value 값을 이용하여 이동에 필요한 벡터를 가져옵니다. 아래는 스크립트 전문입니다.

 

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    public float PlayerSpeed;
    
    Rigidbody2D rigid;
    Vector2 PlayerInputVector;

    // Awake()에서는 초기화 위주로 작업
    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
    }

    // 물리 연산 업데이트는 FixedUpdate()에서 작업
    void FixedUpdate()
    {
        // 노멀라이즈 안하면 대각선 이동이 더 빨라짐, deltaTime은 프레임 사이의 시간
        Vector2 vecNext = PlayerInputVector * PlayerSpeed * Time.fixedDeltaTime;    
       
        // 위치 이동
        rigid.MovePosition(rigid.position + vecNext);
    }

    // Input System 함수
    void OnMove(InputValue value)
    {
        // Input System에서 자체적으로 normalized 하도록 추가했음
        PlayerInputVector = value.Get<Vector2>();
    }
}

 

위 스크립트를 캐릭터에 추가하면 Input System의 액션에서 설정했던 입력이 들어왔을 때 이동을 할 수 있습니다. 다양한 입력을 처리해야 할 때 관리가 굉장히 편리하기 때문에 Input Manager를 사용하는 것보다 편리할 수 있습니다.

 

 

 

맥 파인더 도구 막대 편집 방법, SnailSVN Lite 단축 버튼 사라짐 수정

최근 맥 미니를 새로 사고 기존에 사용하던 아이맥의 데이터를 마이그레이션 하였는데요. 그 뒤에 파인더에 잘 나오고 있던 SnailSVN Lite 도구 막대가 사라졌습니다. 사라진 도구 막대를 찾는 것뿐

kwonriver.co.kr

 

 

[Unity] 가중치 있는 랜덤 뽑기 기능 추가하기

직전에 소환된 객체의 레벨에 따라 가중치를 변경하여 다음 객체의 레벨을 만드는 기능을 추가한다. 가중치는 직전 레벨과 동일한 레벨을 100으로 두며 직전 레벨에서 멀어질수록 감소한다. 먼

kwonriver.tistory.com