내일배움캠프 31일차 TIL : InputSystem의 PlayerInput 방식 비교, 디자인 패턴 특강 1

김정환·2024년 10월 28일
0

키워드

  • InputSystem 호출 방식
  • 디자잍 패턴 특강 1

Input System - PlayerInput 방식 비교

실습 내용 중 Input System 사용 방법을 비교하는 내용이 있었다.
Input Action Asset을 Player Input에 할당하여 입력을 받는 방식의 차이점을 비교해보았다.

지금까지 강의에서 다룬 내용은 Send Messages 방식과 Invoke Unity Events 방식이다.
물론 특강에서 다룬 방법도 포함하면 레거시 방식처럼 사용하는 Direct 방식과 Invoke C Sharp Events도 있지만 오늘 비교한 두 내용만 정리했다.

차이점을 생각해보다가 결합도에서 차이가 있나 싶어서 송지원 튜터님께 여쭤보았고
가장 큰 차이점에 대해 설명을 들었다.

Send Messages

Player Input 컴포넌트가 있는 게임오브젝트의 모든 컴포넌트에게 메시지를 보낸다.

사용법

// vector2 
public void OnMove(InputValue value)
{
    Debug.Log(value.Get<Vector2>());
    // Debug.Log(value.isPressed);

}

// button
public void OnJump(InputValue value)
{
    Debug.Log(value.isPressed);
}
  • 위 코드와 같이 "On + Action이름"(InputValue) 형태의 메서드를 구현하고
    이 컴포넌트를 PlayerInput이 있는 게임오브젝트에 붙이면 된다.

InputValue 주요 기능

  • Get : 입력값을 받는 메서드이다.
  • Get<T> : 입력값을 받는 메서드로 원하는 자료형을 제너릭란이 입력하여 받을 수 있다.
    단, Input Action Asset에서 설정한 입력 방식이 지원하는 자료형인 경우에 한정된다.
  • isPressed : 버튼이 눌렸는지 아닌지 여부를 나타낸다.
    버튼 방식이 아니라면 오류가 뜬다.

특징

  • 직접적인 할당의 과정없이 메서드 구현만 해두어도 입력을 처리할 수 있다.
  • 하지만 이 방법으로 세세한 시점별 조정을 하기 위해선 별도의 구현이 필요하다.
  • 성능적인 측면에서 매우 비싼 방식이다.
    • Send Messages 방식이 Player Input 컴포넌트와 같이 있는 다른 컴포넌트들 전부에게 양식에 맞는 메서드에 찾고 호출을 보낸다. 이 과정에서 비용이 매우 많이 소모된다.

Invoke Unity Events

Player Input을 Unity Event를 사용하듯 원하는 메서드를 넣어 호출할 수 잇다.

사용법

Player Input 컴포넌트에 아래 그림과 같이 Unity Event 항목이 생긴다.
이 항목에 버튼 OnClick 이벤트를 할당하듯이 원하는 컴포넌트를 넣고 메서드를 선택하면 된다.

public void OnMove(InputAction.CallbackContext context)
{
    if(context.phase == InputActionPhase.Started)
    {
        Debug.Log("Move Started");
    }
    else if(context.phase == InputActionPhase.Performed)
    {
        Debug.Log(context.ReadValue<Vector2>());
    }
    else if(context.phase == InputActionPhase.Canceled)
    {
        Debug.Log("Move Canceled");
    }
}
  • 메서드 이름 상관없이 매개변수로 InputAction.CallbackContext를 갖는 메서드를 구현하고
    PlayerInput의 이벤트란에서 원하는 곳에 할당하면 된다.

CallbackContext 주요 기능

  • phase : 입력의 시점, 입력 상태를 받아올 수 있다.
    상태에 대한 정리는 다음과 같다.

    상태 이름설명
    Disabled액션이 활성화되지 않은 상태0
    Waiting액션이 활성화되어 있고 관련된 인풋을 받도록 기다리는 상태1
    Started연동한 컨트롤러가 이제 막 액션을 시작하는 상태, 액션이 시작할 때2
    Performed액션이 진행 중인 상태, 누르고 있는 중3
    Canceled액션이 끝난 상태, 손을 뗀 상태4
  • ReadValue : 입력값을 받아올 수 있다.

  • ReadValue<T> : 입력값을 받는 메서드로 원하는 자료형을 제너릭란이 입력하여 받을 수 있다.
    단, Input Action Asset에서 설정한 입력 방식이 지원하는 자료형인 경우에 한정된다.

특징

  • Player Input의 Unity Event란에 직접 할당해야 작동시킬 수 있다.
  • phase 통해 더 자세한 입력 시점을 이용할 수 있다.
  • 성능 측면에서 Send Messages보다 더 저렴하다.
    • 등록된 컴포넌트의 메서드만 호출하므로 비용이 상당히 절감된다.

성능측면 비용 차이(효율)

Broadcast Message < Send Message < Invoke Unity Event <= Invoke C# Event

  • Broadcast Message :
    Player Input 컴포넌트가 있는 오브젝트뿐만 아니라 자식 오브젝트들의 컴포넌트도 모두 조사한다. 그만큼 비용이 가장 큰 방식이다.
  • Send Message :
    Player Input 컴포넌트가 있는 오브젝트의 컴포넌트들을 모두 조사한다.
    Send Message 식의 방법은 원래 가장 비싼 방식이라고 한다.
  • Invoke Unity Event :
    원하는 메서드만 등록해서 호출할 수 있다.
  • Invoke C# Event :
    Input Action Asset을 C# 클래스로 만들고 여기의 이벤트에 바로 붙여쓰는 방법이다.
    Invoke Unity Event와 비용 측면에서 큰 차이는 없지만 이 방식이 상대적으로 더 저렴하다고 하셨다.

성능 측면에서 추천하는 것은 당연히
Invoke Unity Event, Invoke C# Event 두 방식이다.

디자인 패턴 특강 1

오늘 스탠다드 특강으로 디자인 패턴 특강도 진행되었고 내용을 정리했다.
추후 녹화본이 올라오면 다시 복습하며 정리해볼 것이다.

더 자세한 내용

#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL

profile
사파 개발자

0개의 댓글