오늘배운것 : InputSystem 한걸음
전에 공부했던 내용에 대해서 완전한 이해가 가지 않았다.
그래서 InputSystem이 어떤 구조가 있어야 게임 입력이 제대로 들어가는지 알아보도록 하자
InputSystem의 구조를 다이어그램으로 보자면
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 스파르타 코딩클럽
'개발 TIL' 카테고리의 다른 글
5/16 부트캠프 개발 TIL (UML 다이어그램) (0) | 2024.05.16 |
---|---|
5/14 부트캠프 개발 TIL (FixedUpdate) (0) | 2024.05.14 |
5/10 부트캠프 개발 TIL (오브젝트 풀링과 애니메이션 컨트롤) (0) | 2024.05.10 |
5/9 부트캠프 개발 TIL (Scriptable Objective) (0) | 2024.05.09 |
5/8 부트캠프 개발 TIL (InputAction과 Quaternion) (0) | 2024.05.08 |