유니티/유니티 C#

[유니티/C#] Action을 활용한 InputManager

진서박 2023. 7. 26. 21:57
반응형

Action을 이용해서 MouseAction 이벤트를 구독하고 사용하는 코드

 

KeyBoardAction, MouseAction을 구독한 함수들의 로직을 OnUpdate에서 Invoke()로 모두 실행한다

public class InputManager
{
    public Action KeyBoardAction = null;
    public Action<Define.MouseEvent> MouseAction = null;

    bool _pressed = false;

    public void OnUpdate()
    {
        if (EventSystem.current.IsPointerOverGameObject())
            return;

        if(Input.anyKey && KeyBoardAction != null)
            KeyBoardAction.Invoke();

        if(MouseAction != null)
        {
            if (Input.GetMouseButton(0))
            {
                MouseAction.Invoke(Define.MouseEvent.Press);
                _pressed = true;
            }
            else
            {
                if (_pressed)
                    MouseAction.Invoke(Define.MouseEvent.Click);
                _pressed = false;
            }
        }
    }

    public void Clear()
    {
        KeyBoardAction = null;
        MouseAction = null;
    }
}

 

구독

    void Start()
    {
        // 혹시라도 다른 곳에서 OnMouseClicked를 구독한 경우를 방지하기 위해 삭제 후 재구독
        Managers.Input.MouseAction -= OnMouseClicked;
        Managers.Input.MouseAction += OnMouseClicked;
    }

 

OnUpdate는 한군데에서 굴려준다. 나는 Managers라는 게임매니저 싱글톤 클래스에서 굴려주었다

public class Managers : MonoBehaviour
{
    private InputManager _input = new InputManager();
    public static InputManager Input { get { return Instance._input; } }
    
    void Update()
    {
        _input.OnUpdate();
    }
}
반응형