[20260205] Input System (for Unity 6.0+)

SmartBear·2026년 2월 5일
post-thumbnail

Input System

목표

  • 키보드/마우스/패드/터치를 하나의 구조로 통합
  • New Input System핵심 구성요소 (Action / Map / Binding)
  • 프로젝트에서 어떤 Input 처리 옵션을 언제 사용하는지 판단 가능

기존 Input 방식의 한계

  • PC, Console, Mobile 에 대한 한계가 있다.
if (Input.GetKey(KeyCode.W)) { ..Behavior.. }
  • 키 변경 및 플랫폼 추가시 코드 작성 필요.

New Input System 핵심 구성요소

Input Action Asset
- Action Map
  - Action (Move)
    - Type: Value
      Binding: 키보드, 마우스, 등등...
  - Action (Jump)
    - Type: Button
    - Binding: 키보드, 마우스, 등등....

구성 요소

1. Action Map

  • 입력을 상황 단위로 묶는 그룹
    • Player -> 캐릭터 조작
    • UI -> 메뉴 조작

2. Action

  • 하나의 행동을 의미
    • Move, Jump, Attack

3. Binding

  • Action 을 실행하는 실제 입력 장치
    • WASD
    • Gamepad Stick
    • Touch

4. Control Type

  • Action 에 대한 데이터 타입
    • Vector2
    • Button
    • float

Input Controller 설정

별일 없으면 기본 컨트롤러 사용을 권장한다.
테스트를 위해 위와 같이 추가 후 컨트롤러에 장착하였다.

사용을 위해서는 InspectorPlayer Input Component 를 붙이고 정의한 Input System 을 불러오면 된다.

Player Input 컴포넌트 - Behavior

기본적으로 설정한 Input 의 Action 이름에 On을 붙임
ex: action 이 Jump 일 경우 OnJump

Broadcast

  • 부모와 자식 오브젝트에 같은 Input 함수가 있을 경우 모든 오브젝트에서 해당 Input 이 발생.

Inspector

Script Code

// Parent.cs
public class Parent : MonoBehaviour
{
    private void OnMove()
    {
        Debug.Log("<color=yellow>Parent Move</color>");
    }
    
    private void OnJump()
    {
        Debug.Log("<color=yellow>Parent Jump</color>");
    }
}

// Child.cs
public class Child : MonoBehaviour
{
    private void OnMove()
    {
        Debug.Log("<color=yellow>Child</color> Called Move!!");
    }
    
    private void OnJump()
    {
        Debug.Log("<color=red>Child</color> Called Jump!!");
    }
}

Console Log

Send Messages

  • 내 자신의 Input 함수를 실행

Inspector

Script Code

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMassegeController : MonoBehaviour
{
    private Vector2 moveInput;
    
    private void OnMove(InputValue value)
    {
        moveInput = value.Get<Vector2>();
        Debug.Log($"<color=yellow>Move: {moveInput}</color> ");
    }

    private void OnJump()
    {
        Debug.Log("<color=red>Jump</color> ");
    }
}

Console Log

Invoke Unity Events

  • 기획자와 협업시 많이 활용됨.

Inspector

Script Code

⚠️주의: Binding 할 함수는 public 으로 해야한다.

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerEventController : MonoBehaviour
{
    private Vector3 moveDir;

    void Update()
    {
        transform.Translate(moveDir * (0.5f * Time.deltaTime));
    }
    
    public void OnMove(InputAction.CallbackContext context)
    {
        Vector2 move = context.ReadValue<Vector2>();
        Debug.Log($"<color=red>Move</color> {move}");
        
        moveDir = new Vector3(move.x, 0, move.y);
        
    }

    public void OnJump(InputAction.CallbackContext context)
    {
        if (context.performed)
        {
            Debug.Log("<color=red>Jump</color> ");    
        }
    }
}

Console Log

  • Move 시

    콘솔로는 보기 어렵지만, 일부 Capsule 들이 하찮게 넘어져버렸다....😅

  • Jump 시

Jump Action에서 Button 형으로 설정했기 때문에 OnMove 에서 잘못된 변수 타입을 받게 되어 에러가 발생한 것이다.

Invoke C Sharp Events

  • 케릭터 이동/전투 등 핵심 로직에 많이 활용.

Inspector

Script Code

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerCsharpController : MonoBehaviour
{
    PlayerInput playerInput;

    private void Awake()
    {
        playerInput = GetComponent<PlayerInput>();
    }

    private void OnEnable()
    {
        playerInput.onActionTriggered += HandleInput;
    }

    private void OnDisable()
    {
        playerInput.onActionTriggered -= HandleInput;
    }

    private void HandleInput(InputAction.CallbackContext ctx)
    {
        switch (ctx.action.name)
        {
            case "Move":
                Vector2 move = ctx.ReadValue<Vector2>();
                Debug.Log($"<color=green>Move</color> {move}");
                break;
            case "Jump":
                if(ctx.performed) Debug.Log($"<color=yellow>Jump</color>");
                break;
        }
    }
}

Console Log

profile
Python Dev with Infra -> Game Programmer

0개의 댓글