//구글콘솔 광고 추가가

 


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()함수를 등록시켜준다.

 

이때 -=를 +=하기전에 먼저 한번 해주는데 이유는, 다른 곳에서 모르고 추가로 등록해줄 경우를 대비해서

제거했다가 등록을 시켜준다. (삭제 해줬을 때 등록된 함수가 발견되지 않아도 예외가 발생하지 않음 )

중복으로 호출되는 것을 막아주기 위해 습관적으로 해두는게 좋을 것 같다.


 

728x90
반응형

+ Recent posts