public class InputManager
{
public Action KeyAction = null;
public void OnUpdate()
{
if (Input.anyKey == false)
{
return;
}
if(KeyAction != null)
{
KeyAction.Invoke();
}
}
}
input 클래스에서는 플레이어의 키입력을 체크해서 키입력이 되었을 때 다른 클래스에 키입력을 받았다는 것을 알려준다.
public class GameManager : MonoBehaviour
{
private static GameManager s_instance = null;
public static GameManager instance { get { return s_instance; } }
InputManager _input = new InputManager();
public static InputManager Input { get { return instance._input; } }
private void Update()
{
_input.OnUpdate();
}
}
GameManager 클래스에선 MonoBehaviour를 상속 받지 않은 inputManager를 새롭게 할당해서 객체를 만들어주고,
Update()함수에서 inputManager 클래스에서 만들어 둔 OnUpdate()함수를 실행시켜준다.
public class PlayerController : MonoBehaviour
{
float playerSpeed = 10f;
private void Start()
{
GameManager.Input.KeyAction -= OnKeyBoard;
GameManager.Input.KeyAction += OnKeyBoard;
}
void OnKeyBoard()
{
if (Input.GetKey(KeyCode.W))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), 0.2f);
transform.position += Vector3.forward * playerSpeed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.S))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), 0.2f);
transform.position += Vector3.back * playerSpeed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.A))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), 0.2f);
transform.position += Vector3.left * playerSpeed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.D))
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), 0.2f);
transform.position += Vector3.right * playerSpeed * Time.deltaTime;
}
}
}
PlayerController 클래스에서는 Start() 함수에서 GameManager클래스에서 만들어뒀던 InputManager의 객체를 통해 KeyAction에 OnKeyBoard()함수를 등록시켜준다.
이때 -=를 +=하기전에 먼저 한번 해주는데 이유는, 다른 곳에서 모르고 추가로 등록해줄 경우를 대비해서
제거했다가 등록을 시켜준다. (삭제 해줬을 때 등록된 함수가 발견되지 않아도 예외가 발생하지 않음 )
중복으로 호출되는 것을 막아주기 위해 습관적으로 해두는게 좋을 것 같다.
'유니티' 카테고리의 다른 글
Layer Mask 와 Layer Tag (0) | 2022.08.16 |
---|---|
Raycast에 대해 알아보자. + Input.mousePosition (0) | 2022.08.12 |
Collision, Trigger, RigidBody 에 대하여 공부해보자. (0) | 2022.08.12 |
ResourceManager 클래스를 만들어 보자. (0) | 2022.08.11 |
transform.Rotate()와 transform.eulerAngles의 차이점, Quaternion.Slerp(), player 이동 (0) | 2022.08.10 |