오늘은 구조를 정리한 것을 송지원 튜터님께 피드백을 받아봤다.
기존 유니티 Input 방식을 이용한다면 많은 경우 클래스에 다음과 같은 상황이 발생한다.
기존 방식인 InputManager을 이용하면 게임 내에서 사용자가 원하는대로 리바인딩하기 매우 까다롭다.
InputManager의 문제는 아니지만, 사용하다보면 다음 클래스와 같은 문제가 나타난다.
이는 SRP를 위배하는 방식이라 객체지향적 개발에서는 지양해야할 사항이다.
유니티에서는 새로운 InputSystem을 지원하기 시작했고 Unity 6에서는 정식으로 이 기능을 지원하고 있다.
그러므로 버전이 올라감에 따라 InputSystem에 적응해야할 이유가 커졌다.
복습하면서 더 정리할 필요가 있음
레거시 Input과 유사한 방법이다.
using UnityEngine.InputSystem;
Keyboard keyboard;
Mouse mouse;
Gamepad gamepad;
void Start()
{
keyboard = Keyboard.current;
mouse = Mouse.current;
gamepad = GamePad.current;
}
void Update()
{
if(keyboard.aKey.isPressed)
{
~
}
else if(keyboard.dKey.isPressed)
{
~
}
//
}
인스펙터에서 직접 바인딩 가능.
Update를 안 쓰고 쓸 수 있음. 이제부터 이벤트 방식을 사용.
using UnityEngine.InputSystem;
public float dir;
public InputAction moveAction;
public InputAction jumpAction;
// 오브젝트가 켜졌을 때 구독하고
// 꺼졌다면 구독해제해 주는 것이 프로그래밍 관점에서 완성된 동작
void OnEnable()
{
// 이벤트 방식
// 구독
moveAction.performed += PlayerMove;
moveAction.canceled += PlayerStop;
// 사용 시작
moveAction.Enable();
}
void OnDisable()
{
// 사용 종료
moveAction.Disable();
// 구독 해제
moveAction.performed -= PlayerMove;
moveAction.canceled -= PlayerStop;
}
void PlayerMove(InputAction.CallbackContext value)
{
dir = value.ReadValue<float>();
}
void PlayerStop(InputAction.CallbackContext value)
{
dir = 0;
}
#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL