Unity3D_MMO - 락온

k_hyun·2022년 10월 19일
0

Unity_MMO_Project

목록 보기
24/33

Define.cs

public enum MouseEvent
    {
        Press,
        PointerDown,
        PointerUp,
        Click,
    }

마우스의 상태를 추가하였다.

InputManager.cs

    bool _pressed = false;
    float _pressedTime = 0;

    public void OnUpdate()
    {
        // UI 컴포넌트를 클릭했을 경우 
        if (EventSystem.current.IsPointerOverGameObject())
            return;

        if (MouseAction != null)
        {
            // 마우스 왼쪽 버튼을 누르면
            if (Input.GetMouseButton(0))
            {
                // 아직 누르지 않은 경우
                // 누른 이벤트를 Invoke하고 누른 시간을 기록한다.
                if (!_pressed)
                {
                    MouseAction.Invoke(Define.MouseEvent.PointerDown);
                    _pressedTime = Time.time;
                }
                MouseAction.Invoke(Define.MouseEvent.Press);
                _pressed = true;
            }
            else
            {   
                // 누르다가 뗀 경우
                // 일정시간 내라면 Click이벤트 발생
                if (_pressed)
                {
                    if (Time.time < _pressedTime + 0.2f)
                        MouseAction.Invoke(Define.MouseEvent.Click);
                    MouseAction.Invoke(Define.MouseEvent.PointerUp);
                }                                            
                _pressed = false;
                _pressedTime = 0;
            }
        }
    }

마우스의 왼쪽 버튼을 누르는 순간, 홀드, 떼는 순간을 위한 코드를 추가하였다.

PlayerController.cs

void OnMouseEvent(Define.MouseEvent evt)
    {
        if (_state == PlayerState.Die)
            return;

        RaycastHit hit;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        bool raycastHit = Physics.Raycast(ray, out hit, 100.0f,_mask);
        // Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);

        switch (evt)
        {
            // 처음으로 누르는 순간 일어나는 이벤트
            case Define.MouseEvent.PointerDown:
                if (raycastHit)
                {
                    _destPos = hit.point;
                    _state = PlayerState.Moving;

                    if (hit.collider.gameObject.layer == (int)Define.Layer.Monster)
                        _lockTarget = hit.collider.gameObject;
                    else
                        _lockTarget = null;
                }
                break;
            // 누르는 동안 일어나는 이벤트
            case Define.MouseEvent.Press:
                if (_lockTarget != null)
                    _destPos = _lockTarget.transform.position;
                else if (raycastHit)
                    _destPos = hit.point;
                break;
            // 버튼을 떼는 순간 일어나는 이벤트
            case Define.MouseEvent.PointerUp:
                _lockTarget = null;
                break;

        }

처음으로 눌렀을 때 누른 것에 따라 _lockTarget을 설정해주었다.

나중에 몬스터의 락온 하기 위한 변수이다.

0개의 댓글