유니티 엔진/입력 처리 심화

유니티 입력 처리 심화 - (3) Action Asset 방식_02

monstro 2024. 12. 24. 20:04
728x90
반응형

이전 포스트에서는 Action Asset의 세부사항과 구성에 대해 알아보았습니다.

이번 포스트에서는 본격적으로 Action Asset을 C# 스크립트에서 사용하는 방식에 대해 알아보겠습니다.

스크립트에서 Action Asset을 사용하는 방식은 총 2가지로 구분할 수 있습니다.

 

1) Inspector 참조를 통한 사용

사용하는 코드는 다음과 같습니다.

public class InspectorRef : MonoBehaviour
{
    // Action Asset
    public InputActionAsset actionAsset;

    // Action Asset 아래의 Action Map
    private InputActionMap inGround;

    // Action Map 아래의 Action
    private InputAction moveAction;
    private InputAction spaceAction;

    public float valueX;
    public bool tryToPress;

    private void Awake()
    {
        // Action Asset으로 InputAction을 연결
        // spaceAction = actionAsset.FindActionMap("InGround").FindAction("Press");

        // Action Map으로 InputAction을 연결
        inGround = actionAsset.FindActionMap("InGround");
        spaceAction = inGround.FindAction("Press");
        moveAction = inGround.FindAction("MoveHorizontal");
    }


    private void OnEnable()
    {
        spaceAction.performed += PressExample;
        spaceAction.canceled += PressStopExample;

        // Action Asset을 활성화 - 연결된 모든 ActionMap이 활성화됨
        // actionAsset.Enable();

        // Action Map을 활성화 - 연결된 모든 Action이 활성화됨
        inGround.Enable();
    }

    private void OnDisable()
    {
        spaceAction.performed -= PressExample;
        spaceAction.canceled -= PressStopExample;

        // Action Asset을 비활성화 - 연결된 모든 ActionMap이 비활성화됨
        // actionAsset.Disable();

        // Action Map을 비활성화 - 연결된 모든 Action이 비활성화됨
        inGround.Disable();
    }

    private void Start()
    {

    }

    private void Update()
    {
        valueX = moveAction.ReadValue<float>();
        Debug.Log("valueX : " + valueX);
    }

    private void PressExample(InputAction.CallbackContext value)
    {
        tryToPress = true;
        Debug.Log("tryToPress : " + tryToPress);
    }

    private void PressStopExample(InputAction.CallbackContext value)
    {
        tryToPress = false;
        Debug.Log("tryToPress : " + tryToPress);
    }
}

 

총 2개의 Action을 사용하는데 다음과 같습니다.

 

Inspector 참조라고 불리는 가장 큰 이유

사용하는 Input Asset을 Inspector 창에서 설정해야 하기 때문입니다.

위의 코드인 InspectorRef를 컴포넌트로 설정한 후 Inspector 창을 살펴보겠습니다.

 

 

Input Asset을 Inspector 창에서 참조로 넘겨주는 것을 확인할 수 있습니다.

다음으로 실행 결과를 살펴보겠습니다.

 

 

위와 같이 잘 실행되는 것을 확인할 수 있습니다.

다음으로는 Input Asset을 사용하는 다른 방법인 C# 클래스 래핑을 알아보겠습니다.

 

2) C# 래핑 클래스를 사용

C# 클래스 래핑은 수행하기 전 먼저 Action Asset에서 작업을 하나 수행해야 합니다.

 

Generate C# Class를 실행하여 동일한 이름의 C# 클래스를 하나 생성하겠습니다.

 

아무런 설정없이 생성하면

Action Asset과 동일한 이름의 동일한 경로에 스크립트가 생성됨을 확인할 수 있습니다.

이제 코드로 넘어가보겠습니다.

 

public class ActionAssetClassRef : MonoBehaviour
{
    // 생성된 InputAsset의 클래스를 인스턴스로 가져옴
    private ActionAsset actionAsset;

    public float valueX;
    public bool tryToPress;

    private void Awake()
    {
        actionAsset = new ActionAsset();
    }

    private void OnEnable()
    {
        actionAsset.InGround.Press.performed += PressExample;
        actionAsset.InGround.Press.canceled += PressStopExample;

        // InputAsset 클래스에서 ActionMap을 가져와 활성화
        // actionAsset.PlayerNormal.Enable();

        // InputAsset 클래스에서 InputAsset을 활성화
        actionAsset.Enable();
    }

    private void OnDisable()
    {
        actionAsset.InGround.Press.performed += PressExample;
        actionAsset.InGround.Press.canceled += PressStopExample;

        // InputAsset 클래스에서 ActionMap을 가져와 비활성화
        // actionAsset.InGround.Disable();

        // InputAsset 클래스에서 InputAsset을 비활성화
        actionAsset.Disable();
    }

    private void Start()
    {

    }

    private void Update()
    {
        valueX = actionAsset.InGround.MoveHorizontal.ReadValue<float>();
        Debug.Log("valueX : " + valueX);
    }

    private void PressExample(InputAction.CallbackContext value)
    {
        tryToPress = true;
        Debug.Log("tryToPress : " + tryToPress);
    }

    private void PressStopExample(InputAction.CallbackContext value)
    {
        tryToPress = false;
        Debug.Log("tryToPress : " + tryToPress);
    }
}

 

기존의 Inspector 참조에 비해 문자열을 사용하지 않아

ActionMap이나 Action의 이름이 일치하지 않아 발생하는 문제를 줄일 수 있습니다.

 

또 기존의 Inspector 참조에서는 ActionMap을 활성화/비활성화하였지만,

이번에는 ActionAsset을 활성화/비활성화하여 입력을 수행하도록 설정하였습니다.

 

그리고 Inspector 참조와 가장 큰 차이점으로는 

래핑 클래스를 사용하는 경우 Input Asset의 변경점을

따로 Save Asset으로 반영하지 않아도 즉시 반영한다는 차이점이 존재합니다.

 

최종적으로 사용 결과를 한번 살펴보겠습니다.

 

위와 같이 문제없이 실행되는 것을 볼 수 있습니다.

728x90
반응형