void Update()
{
float _turnSpeed = 0.2f;
//Local -> World
if (Input.GetKey(KeyCode.W))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), _turnSpeed);
transform.position += Vector3.forward * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.S))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), _turnSpeed);
transform.position += Vector3.back * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.A))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), _turnSpeed);
transform.position += Vector3.left * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.D))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), _turnSpeed);
transform.position += Vector3.right * Time.deltaTime * _speed;
}
}
이런 식으로 Update 문 마다 key가 입력됐는지 확인한다고 하자. 위 코드는 이동키만 구현했지만 다른 키 입력들도 Update에서 확인하거나 다른 Script에서도 키 입력에 대한 코드를 사용하면 관리하기 어려워진다. 따라서 inputManager를 만들어 Input을 관리해야한다.
일단 InputManager
를 만든다
//Component로 넣지 않을거니까 MonoBehavior를 상속하지 않아도 된다.
public class InputManager
{
//이벤트 생성
public event Action KeyAction = null;
//MonoBehavior를 상속받지 않으므로 Update할 함수도 구현해줘야함
public void OnUpdate()
{
if(Input.anyKey == false)
return;
if(KeyAction != null)
{
//이벤트 발생
KeyAction.Invoke();
}
}
}
이제 어떤 키가 입력된다면 이벤트핸들러로 등록된 메소드들에 연락이 가고 키코드에 맞는 메소드가 실행될것이다.
InputManager
의 OnUpdate()
는 매 프레임마다 호출되어 Input을 확인해야하므로 Managers
를 통해 구현해보자
public class Managers : MonoBehavior
{
static Managers s_instance;
static Managers Instance { get { Init(); return s_instance; } }
InputManager _input = null;
//public 프로퍼티를 통해 다른 객체에서 이벤트핸들러로 등록할수 있다.
public InputManager Input { get { return instance._input; } }
void Start()
{
_input = new InputManager();
}
void Update()
{
//매 프레임별 Input 확인
_input.OnUpdate();
}
}
Input말고도 다른 항목의 Manager들도 Managers
를 통해 관리하게 된다.
PlayerController
에서는 이벤트 핸들러를 등록해 키입력시 연락을 받아야한다.
public class PlayerController : MonoBehavior
{
void Start()
{
//OnKeyboard를 이벤트에 등록한다.
Managers.Input.KeyAction += OnKeyboard;
}
//키입력시 호출되어야 할 부분을 메소드로 따로 분리시킨다
void OnKeyboard()
{
float _turnSpeed = 0.2f;
//Local -> World
if (Input.GetKey(KeyCode.W))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), _turnSpeed);
transform.position += Vector3.forward * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.S))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), _turnSpeed);
transform.position += Vector3.back * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.A))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), _turnSpeed);
transform.position += Vector3.left * Time.deltaTime * _speed;
}
if (Input.GetKey(KeyCode.D))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), _turnSpeed);
transform.position += Vector3.right * Time.deltaTime * _speed;
}
}
}
Start
에서 static프로퍼티인 Input을 통해 이벤트핸들러를 등록해주기만 하면 Input을 손쉽게 관리할 수 있다.