[Unity Manager] Input Manager

dd_ddong·2022년 5월 17일
0

Unity

목록 보기
3/9

input 최적화

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

일단 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();
        }
    }
}

이제 어떤 키가 입력된다면 이벤트핸들러로 등록된 메소드들에 연락이 가고 키코드에 맞는 메소드가 실행될것이다.

Managers

InputManagerOnUpdate()는 매 프레임마다 호출되어 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

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을 손쉽게 관리할 수 있다.

0개의 댓글