스탠다드 특강 2 - Input System 복습

김정환·2024년 10월 16일
0

Input System

  • Input => Input System으로
  • 객체지향적 설계 방법
  • 대체로 기존 방식을 이용한다면 입력을 받는 기능 + 받은 입력으로 움직임을 계산하는 기능
    • SRP를 위배
    • 객체지향을 위해서 책임(역할, 기능) 분리
      • 입력을 받는 클래스
      • 받은 입력으로 움직임을 계산하는 클래스

레거시 Input에서 Input System으로

InputSystem - Direct 방식

공식 문서 Direct

레거시 Input과 유사한 방법

using UnityEngine.InputSystem;

Keyboard keyboard;
Mouse mouse;
Gamepad gamepad;

void Start()
{
	keyboard = Keyboard.current;
    mouse = Mouse.current;
    gamepad = GamePad.current;
}

void Update()
{
	if(keyboard.aKey.isPressed)
    {
    	~
    }
    else if(keyboard.dKey.isPressed)
    {
    	~
    }
    
    //
}

그 외 예시

keyboard.aKey.wasPressedThisFrame : 누른 첫 순간만 true
keyboard.aKey.isPressed : 누르는 동안 전부 true
keyboard.aKey.wasReleasedThisFrame : 눌렀다가 뗀 순간 true
mouse.leftButton.isPressed : 좌클릭
mouse.rightButton.isPressed : 우클릭
mouse.scroll.ReadValue : 스크롤 입력

특징

  • 그 외 gamepad, joystick도 지원
  • 빠르게 프로토타입 개발이 가능

InputSystem - Imbedded 방식

  • 인스펙터에서 직접 바인딩 가능.
  • Update를 안 쓰고 쓸 수 있음. 이제부터 이벤트 방식을 사용.
  • 다소 복잡해질 수 있으나, 불필요하게 Update에서 매 프레임 확인하지 않아도 됨.
// 필드에 선언
public InputAction moveAction;

InputAction을 위의 코드처럼 선언하면 인스펙터에서 직접 바인딩할 수 있다.


void Start()
{
    moveAction.performed += TestInput;
}

void TestInput(InputAction.CallbackContext value)
{
	//~~
}

코드에서 접근해보면 다음 3개의 이벤트(번개 아이콘)를 볼 수 있다.

using UnityEngine.InputSystem;

public float dir;
public InputAction moveAction;
public InputAction jumpAction;

public event UnityAction OnJumpEvent;

// 오브젝트가 켜졌을 때 구독하고
// 꺼졌다면 구독해제해 주는 것이 프로그래밍 관점에서 완성된 동작
void OnEnable()
{
	// 이벤트 방식
    // 구독
    moveAction.performed += PlayerMove;
    moveAction.canceled += PlayerStop;
    
    jumpAction.started += PlayerJump;
    
    // 사용 시작
    moveAction.Enable();
    jumpAction.Enable();
}

void OnDisable()
{
    // 사용 종료
    moveAction.Disable();
    jumpAction.Disable();
    
	// 구독 해제
    moveAction.performed -= PlayerMove;
    moveAction.canceled -= PlayerStop;
    
    jumpAction.started -= PlayerJump;
    
}

void PlayerMove(InputAction.CallbackContext value)
{
	dir = value.ReadValue<float>();
}

void PlayerStop(InputAction.CallbackContext value)
{
	dir = 0;
}

void PlayerJump(InputAction.CallbackContext value)
{
	OnJumpEvent?.Invoke();
}

시점

  • moveAction.started : 처음 눌렀을 때 이벤트 호출 (한 번)
  • moveAction.performed : 누르고 있을 때 이벤트 호출 (누르는 동안 계속)
  • moveAction.canceled : 뗐을 때 이벤트 호출 (한 번)

InputSystem - 액션 에셋 방식

  • 강의 방식 -> 액션 에셋에 PlayerInput 사용
  • InputActionAsset에 직접 접근해 쓸 수 있음
using UnityEngine.InputSystem;

public float dir;
public UnityAction jumpAction;

public InputActionAsset actionAsset;

InputActionMap basic;

InputAction moveAction;
InputAction jumpAction;


// 오브젝트가 켜졌을 때 구독하고
// 꺼졌다면 구독해제해 주는 것이 프로그래밍 관점에서 완성된 동작
void OnEnable()
{
	basic = actionAsset.FindActionMap("basic");
    
    moveAction = basic.FindAction("Move");
    jumpAction = basic.FindAction("Jump");
    
    //이벤트 할당
    // enable
    moveAction.performed += PlayerMove;
    moveAction.canceled += PlayerStop;
    
    basic.Enable(); // 전체 켜기
    // 또는
    moveAction.Enable(); // 부분 켜기
    jumpAction.Enable();
}

void OnDisable()
{
    // 사용 종료
    moveAction.Disable();
    
	// 구독 해제
    moveAction.performed -= PlayerMove;
    moveAction.canceled -= PlayerStop;
    
}

void PlayerMove(InputAction.CallbackContext value)
{
	dir = value.ReadValue<float>();
}

void PlayerStop(InputAction.CallbackContext value)
{
	dir = 0;
}

InputSystem - C# Generate 방식

  • 가장 진화된 방식
  • 액션 에셋을 보면 Generate C# 클래스라는 버튼이 있음.
    • 누르면 c# 클래스 > json 형태로 입력한 액션들로 작성된 코드가 나옴.
    • 이 클래스를 받아와 클래스 스크립트 사용하듯이 사용할 수 있음.

InputAction Asset

  • Interaction 탭 : 세부적인 입력 감지 방법에 대한 것
    • Hold
      • Press Point : 0.5 = 감지하는 범위 / 현재 반쯤 눌러도 감지하는 것으로
      • Hold Time : 0.4 = 감지하는 시간 / 감지하려면 0.4초 눌러야 한다는 의미
    • Tap
      • max tap duration : 0.2 / 0.2초 안에 떼야 함. 그 이후에 떼면 작동하지 않음
    • Slow Tap
      • max tap duration
    • Multi Tap : 여러 횟수 입력해야 작동하도록
    • Press : 눌렀는 지에 따라
    • 중첩도 가능하나 권장하진 않음
  • Processors : 입력에 대한 처리 구간
    • Axis Deadzone : 입력 인정 구간
      • Min : 0.125
      • Max : 0.5
    • Invert : 입력 반전
    • Scale : 입력값 * n 만큼 처리
    • Clamp : 최솟값, 최댓값 지정
    • Normalize : 정규화. 값을 지정 범위 내의 값으로 반환
  • modifier
    • 어떤 입력을 받을 때, 부가적으로 다른 키를 누를 수 있도록 함.
    • space : 일반 공격, shift + space : 강 공격

키 리바인딩

  • 유니티에서 프리셋을 만들어 놓음.
profile
사파 개발자

0개의 댓글