유니티 인풋 시스템

정선호·2023년 5월 4일
0

Unity Features

목록 보기
1/28

관련 강의
공식 가이드

인풋 시스템

  • VR, 모바일, 콘솔 등 여러 입력에 유연하게 대응하기 위해 기존의 Input Manager를 대체하는 시스템
  • 패키지 매니저에서 Input System을 인스톨하여 사용할 수 있음

Input Actions

  • 게임 내 모든 입력을 일괄적으로 매핑하게 해주는 시스템
  • Action Maps에 입력값을 받을 대상을 지정
  • Actions에 지정한 대상이 실시할 액션을 추가
  • Properties에 액션을 실행시킬 입력값을 할당

Actions Mapping

  • 입력받는 방법은 3가지가 있음
    • Value : 기본값, 컨트롤 상태에 대한 지속적인 변경을 추적해야 하는 모든 입력에 사용
    • Button : 누를 때마다 한 번씩 동작을 트리거하는 입력에 사용
    • Pass Through : 바인딩된 컨트롤을 변경하면 해당 컨트롤 값으로 콜백이 트리거됨, 액션 집합의 모든 입력을 처리하려는 경우 유용

  • 입력받을 수 있는 값의 유형은 위와 같음

Bind with Code

  • Send Message : 키가 입력되면 해당 오브젝트의 모든 컴포넌트에 메시지 함수를 보냄
  • BroadCast Message : Send Message와 동일하지만 자식 컴포넌트들에게도 메시지가 보내짐
  • Invoke Unity Event : 유니티의 Event System과 동일한 방식으로 객체 내 함수를 해당 입력 이벤트에 바인딩함.
  • Invoke C Sharp Events : Input Actions에서 설정한 키들을 바탕으로 유니티가 C# 코드를 작성해줌. Save Asset시 코드도 자동으로 업데이트됨

C# 이벤트 호출

  • 유니티가 작성한 입력 클래스를 사용할 클래스에 선언하여 사용
  • 선언 후 원하는 Actions Maps를 활성화시킴
  • Actions에 입력된 각각의 키 바인딩에 맞춰 실행할 함수들을 추가해줌
    • Waiting : 키 입력 대기시
    • Started : 키 입력이 시작되어 값은 받았지만 실행이 완료되지 않았을 시
    • performed : 키 입력받고 실행이 완료되었을 때
    • canceled : 키 입력 해제시

Change Action Maps

  • 인게임 -> 일시 정지 상태 UI 등 게임 상황이 바뀌며 입력값 처리도 바뀔 때 사용
  • PlayerInput.SwitchCurrentActionMap(string actionName)함수로 변경

Button Remapping

  • Invoke C Sharp Events를 이용할 때 변경을 원하는 키 값에 접근한 후 PerformInteractiveRebinding()함수를 사용하여 변경 가능

Touch Controls

  • InputSystem 설치시 On-Screen Stick 컴포넌트도 설치됨
  • 캔버스의 가상스틱에 해당 컴포넌트를 임포트하여 터치 컨트롤 구현 가능

깔끔한 액션 할당 및 해제

액션의 중복 할당, 오남용 등을 방지하기 위해서 다음과 같은 작업을 해 준다.

  • Enable, Disable될 때 바인딩 연결 및 해제와 액션의 활성화 여부를 변경한다.
private void OnEnable()
{    
    inputAction_track1.started += CallbackTrack1;
    inputAction_track1.Enable();       
}

private void OnDisable()
{
    inputAction_track1.started -= CallbackTrack1;
    inputAction_track1.Disable();
}
  • 원하는 함수가 맞는 키 상태에 발동되는지 확인한다.
private void CallbackTrack1(InputAction.CallbackContext context)
{
    if(context.action.phase == InputActionPhase.Started)
    {
        Attack();
    }
}

인풋 시스템의 액션 타입

강의 영상

액션 타입 개요

인풋 시스템의 프로퍼티 설정에서 액션 타입은 Value, Button, Pass Through의 총 세가지 종류가 있다.

인풋 시스템은 이벤트 기반이다.
즉 특정 입력이 들어오면 인풋 시스템이 이에 해당하는 이벤트들을 발생시키는 구조이다.

개발자는 해당 입력 이벤트에 원하는 함수들을 구독시켜놓음으로써 입력을 할당한다.

인터랙션(Interaction)

추가 강의 영상

인풋 시스템에서 할당하는 모든 액션은 인터랙션을 갖고 있다.
인터랙션은 단순하게 게임 내에서 상호작용하는 방식을 뜻한다.

개발자는 여러 종류의 인터랙션을 액션 매핑 도중 추가할 수 있다.

모든 액션은 기본적인 인터랙션을 갖고 있다. 이 인터랙션은 구 입력 시스템의 Press와 유사하다.

  • Started : 입력값이 들어와 인터랙션이 시작되는 때
  • Performed : 인터랙션이 완료되었을 때(키를 충분히 오래 눌러 Hold인터랙션이 완료되었을 때 등)
  • Canceled : 인터랙션이 취소되었을 때(키를 누르던 중간에 떼어 Hold 인터랙션이 완료되지 않았을 때 등)

인터랙션에 대한 시간표는 다음과 같다

값(Value)

개발자는 입력에서 다양한 값들을 받아올 수 있다.

명확화

값을 받아올 때 인풋 시스템은 명확화(disambiguation)을 실시한다.
인풋 시스템의 명확화란 어떤 것이 주 조작(main control)인지 결정하는 과정을 뜻한다.
이는 한 번에 하나의 입력을 기대할 때 매우 유용한 과정이다.

명확화는 따른 값 변화에 따른 인터랙션을 확인하면 이해하기 쉽다.

  • Start인터랙션은 액션에 대한 값이 기본값과 달라지면 실행된다.
  • Peformed인터랙션은 액션에 대한 값이 변화될 때마다 실행된다.
    따라서 값이 처음 변화될 때에는 StartPerformed가 동시에 실행되게 된다.
  • Canceled인터랙션은 액션에 대한 값이 다시 기본값으로 돌아갈 때 실행된다.

명확화로 인해 ValuePassthrough의 차이점이 갈린다.
Passthrough는 모든 입력값을 가져오지만, Value는 명확화와 초기 상태 체크를 수행하여 걸러진 입력값을 가져온다.

초기 상태 체크

Value의 초기 상태 체크는 입력 액션 활성화 시에 실시하는 상태 체크를 말한다.
만약 액션이 Enable()로 활성화되었을 때 컨트롤러가 디폴트 값이 아닌 값(버튼이 이미 눌려져 있는 상태)을 갖고 있으면, 인풋 시스템은 이에 해당하는 이벤트를 전송해준다.

반면 Passthrough는 활성화되었을 때의 값이 디폴트 값이 아니더라도 이벤트가 전송되지 않는다.

버튼(Button)

버튼은 입력 시 값 전달 없이 액션을 트리거시키는 종류이다. 초기 상태 체크 또한 하지 않는다.

인터랙션을 이용해 이벤트의 전송 시점을 변화시킬 수 있다.
예를 들어 Press인터랙션을 추가하여 한계점을 등록하면, 버튼이 눌리기 시작했을 때 Start가 호출되고, 버튼이 한계점 이상으로 눌렸을 때 Performed가 호출된다.

패스스루(Passthrough)

명확화를 하지 않아 주 입력이 없이 모든 입력을 직접적으로 받아온다.
인터랙션에서 설정해주지 않는 한 StartCanceled이벤트를 전송하지 않는다.
초기 상태 체크를 하지 않는다.

Value vs Passthrough

profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글