Input System
InputAction은 Unity에서 제공하는 비교적 최근에 생긴 입력 시스템의 일부로, 사용자 Input을 처리하는 데 사용된다.
이 시스템은 게임 컨트롤러, 키보드, 마우스 및 터치 입력과 같은 다양한 플랫폼의 입력 방식을 지원합니다.
InputAction은 사용자 Input을 감지하고 해당 입력에 대한 Event를 트리거하는 데 사용된다.
그래서 처음에 유니티를 배울때는 Input.GetKey~ 종류의 Method를 사용했었다. 이게 간단하게 바로바로 사용할 수 있으니 자주 썻었다.
물론 지금도 개발중인 게임이 다른 플랫폼 지원이고 뭐고 하는게 아니라 단순 연습용이다보니, 굳이 안써도 되는데, 한번 공부해보려고 InputSystem을 열심히 써보면서 개발중이다.
InputAction은 기본적으로 입력 Event와 해당 Event가 트리거될 때 실행할 수 있는 Action을 정의한다. 예를들어 사용자가 키보드의 방향키(및 이에 해당하는 다른 플랫폼들에 키)를 누르고, 그 Action에 Player가 움직일 수 있도록 Move Method를 등록하여 사용하는 식이다.
(현재 사용중인 InputActionAsset이다. 물론 임시로 설정만 해놓은 것들도 있다)
InputAction은 입력 Event의 종류와 트리거 조건을 정의하는 InputActionAsset을 생성하는 것이 시작이다.
InputActionAsset은 여러 InputAction을 포함하는 파일로, 게임에서 사용되는 여러 입력Event 를 정의하는 데 사용된다.
아래는 공식문서로 사실상 거의 모든 정보가 여기있다.
https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_phase
Class InputAction | Input System | 1.0.2
Class InputAction A named input signal that can flexibly decide which input data to tap. Inheritance InputAction Assembly : solution.dll Syntax [Serializable] public sealed class InputAction : ICloneable, IDisposable Constructors InputAction() Declaration
docs.unity3d.com
아래는 예시 코드이다.
public class PlayerController : StateMachine
{
public static PlayerController Inst;
public PlayerInput input;
[NonSerialized] public Vector3 moveVec;
private InputAction _normalMoveAction;
public float moveSpeed;
public float defaultSpeed = 30.0f;
private float defaultDashTime = 0.2f;
[NonSerialized] public float moveSpeedMultiplier = 1;
private void Init()
{
moveSpeed = defaultSpeed;
}
private void Awake()
{
this._normalMoveAction = this.input.actions["Move"];
Init();
if (Inst != null && Inst != this)
{
Destroy(gameObject);
return;
}
Inst = this;
}
private void Update()
{
MovePlayer();
UpdateSprite();
}
private void OnEnable()
{
this._normalMoveAction.performed += this.OnMove;
this._normalMoveAction.canceled += this.StopMove;
}
private void OnDisable()
{
this._normalMoveAction.performed -= this.OnMove;
this._normalMoveAction.canceled -= this.StopMove;
}
#region InputAction : Move
private void OnMove(InputAction.CallbackContext context)
{
Vector2 vector = context.ReadValue<Vector2>();
this.moveVec = new Vector3(vector.x, vector.y, 0f).normalized;
}
private void StopMove(InputAction.CallbackContext context)
{
this.moveVec = Vector3.zero;
}
private void MovePlayer()
{
if (!this.canMove)
{
return;
}
this.sprite.transform.position += moveSpeedMultiplier * Time.deltaTime;
Vector3 position = this.sprite.transform.position;
this.sprite.transform.localPosition = Vector3.zero;
base.transform.position = position;
}
#endregion;
결국 InputAction또한 Delegate 기반이니, Scene 전환 등의 이유로 오브젝트가 파괴될 때, Delegate 등록을 반드시 해제하게 만드는 것이 좋다.
또 단순히 Action 뿐만아니라 Interaction에 다양한 종류가 있는데, 아직 사용하지는 않지만
다양한 Action Type + Interaction에 관한 글을 찾았다. 처음에 Interaction 때문에 좀 해매서 지금은 사용하지는 않는데
참고하면 좋을 것 같다
Learning new InputSystem - when and how is the Cancelled callback used?
Hey folks, I'm working my way through the new input documentation and tutorials, most of which seems fairly clear. However, I'm a little confused by...
forum.unity.com
참 처음에 다루기는 어려운데, 쓰면 쓸수록 잘 짜여진 시스템 같긴 하다.