public class InputManager
{
public Action KeyAction = null;
public void OnUpdate()
{
if (Input.anyKey == false)
return;
if (KeyAction != null)
KeyAction.Invoke();
}
}
버튼입력을 위한 InputManager 스크립트를 작성하였다.
Action을 사용하였는데 이는 반환값이 없는 메서드를 등록하는 델리게이트이다.
Managers.cs의 Update()에서 OnUpdate()함수를 작동한다.
public class Managers : MonoBehaviour
{
static Managers s_instance;
static Managers Instance { get { Init(); return s_instance; } } // 외부에서 다른 Manager를 호출하여 Instance를 호출할 때
// Init()함수도 호출됨
InputManager _input = new InputManager();
public static InputManager Input { get { return Instance._input; } }
...
void Update()
{
_input.OnUpdate();
}
}
public class PlayerController : MonoBehaviour
{
[SerializeField]
float _speed = 10.0f;
void Start()
{
// 구독 취소 후 신청 느낌
Managers.Input.KeyAction -= OnKeyboard;
Managers.Input.KeyAction += OnKeyboard;
}
...
void Onkeyboard()
{
...
}
OnKeyboard() 함수는 키를 눌렀을 때 캐릭터가 이동하고 회전하는 기능을 넣어놓았다.
우선 PlayerController.cs의 Start()에서 KeyAction이 등록이 된다.
Managers.cs 에서 Update() 안에서 _input.OnUpdate()가 매 프레임 실행이 된다.
만약 버튼이 눌리면 OnUpdate()의 keyAction 즉 OnKeyboard()가 실행되어 캐릭터가 움직이게 된다.