개발 TIL

5/13 부트캠프 개발 TIL (InputAction 활용)

HJTL 2024. 5. 13. 20:30

오늘배운것 : InputSystem 한걸음

 

전에 공부했던 내용에 대해서 완전한 이해가 가지 않았다.

그래서 InputSystem이 어떤 구조가 있어야 게임 입력이 제대로 들어가는지 알아보도록 하자

 

InputSystem의 구조를 다이어그램으로 보자면

SampleController는 PlayerController에 상속주고 PlayerMovement와 PlayerConfirm은 속성으로 사용한다.

 

public class SampleController : MonoBehaviour
{
    public event Action<Vector2> OnMoveEvent;
    public event Action<float> OnConfirmEvent;
    public event Action<float> OnCancelEvent;
	
    //event속성을 Invoke메서드로 호출한다.
    public void CallMoveEvent(Vector2 move) => OnMoveEvent?.Invoke(move);
    public void CallConfirmEvent(float confirm) => OnConfirmEvent?.Invoke(confirm);
    public void CallCancelEvent(float cancel) => OnCancelEvent?.Invoke(cancel);
}

메서드의 파라미터에 맞는 변수형으로 전달한다.

 

public class PlayerController : SampleController
{
    //Input System과 연동할 코드(?)

    public void OnMove(InputValue value)
    {
    	//InputValue를 Vector2로 변환 필요
        Vector2 moveInput = value.Get<Vector2>();
        CallMoveEvent(moveInput);
    }

    public void OnConfirm(InputValue value)
    {
        CallConfirmEvent(value.Get<float>());
    }

    public void OnCancel(InputValue value)
    {
        CallCancelEvent(value.Get<float>());
    }
}

이 코드는 InputValue라는 파라미터를 받아서 각 이벤트로 가서 처리한다. 근데 InputValue가 InputActions의 이벤트를 받는건지 정확한건 모르겠다...

참고로 InputActions의 속성과 메서드 이름이 동일해야하고 앞에 On을 붙여야 동작할수 있다.

메서드나 Actions속성 이름을 다르게 하거나 앞에 On을 붙이지 않으면 동작하지 않는다.

 

public class PlayerMovement : MonoBehaviour
{
    private SampleController controller;
    private Vector2 movementDirection = Vector2.zero;

    private void Awake()
    {
        controller = GetComponent<SampleController>();
    }
    private void Start()
    {
        controller.OnMoveEvent += Move;
    }
    private void FixedUpdate()
    {
        ApplyMoving(movementDirection);
    }
    private void Move(Vector2 direction)
    {
        movementDirection = direction;
    }
    private void ApplyMoving(Vector2 direction)
    {
        direction *= 5;
        rig2d.velocity = direction;
    }
}

이것은 이동과 관련된 기능

 

public class PlayerConfirm : MonoBehaviour
{
    private SampleController controller;
    private SpriteRenderer spriteRenderer;  //버튼이 제대로 입력되었는지 알아보기 위해 색으로 접근

    private float isConfirm = float.MinValue;
    private float isCancel = float.MinValue;

    private void Awake()
    {
        controller = GetComponent<SampleController>();
        spriteRenderer = GetComponentInChildren<SpriteRenderer>();
    }

    private void Start()
    {
        controller.OnConfirmEvent += Confirm;
        controller.OnCancelEvent += Cancel;
    }

    private void FixedUpdate()
    {
        ApplyButtonFunction();
    }

    private void Confirm(float c)
    {
        isConfirm = c;
    }

    private void Cancel(float c)
    {
        isCancel = c;
    }

    private void ApplyButtonFunction()  //버튼 입력에 따른 판정
    {
        // Confirm : 빨강, Cancel : 청록
        Color color = Color.white;
        if (isConfirm > 0f)
            color = Color.red;
        else if (isCancel > 0f)
            color = Color.cyan;
        else
            color = Color.white;
        spriteRenderer.color = color;
    }
}

이것은 키를 누르면 기능적으로 수행하게 하는 코드인데 각 키를 한번 누르면 기능이 따로 일어나야 하는데 스크립트를 따로 나누었더니 하나의 기능만 실행되었다. 그래서 키를 한번 누르는 이벤트를 하나의 파일로 통합하였다. 

(Z : confirm, X : cancel)

컨트롤러의 인스펙터

 

적용한 결과

 

by 스파르타 코딩클럽