Unity3D_MMO - 공격 (2)

k_hyun·2022년 10월 20일
0

Unity_MMO_Project

목록 보기
26/33

PlayerController.cs

void UpdateSkill()
    {        
        // 공격할때 타겟 방향으로 회전
        if (_lockTarget != null)
        {
            Vector3 dir = _lockTarget.transform.position - transform.position;
            Quaternion quat = Quaternion.LookRotation(dir);
            transform.rotation = Quaternion.Lerp(transform.rotation, quat, 20 * Time.deltaTime);
        }
    }
void OnHitEvent()
    {
        if (_stopSkill)
            State = PlayerState.Idle;
        else
            State = PlayerState.SKill;
    }

변수 _stopSkill에 따라서 animation Event가 발생했을 때 상태를 갱신하게 하였다.

void OnMouseEvent(Define.MouseEvent evt)
    {
        switch (State)
        {
            case PlayerState.Idle:
                OnMouseEvent_IdleRun(evt);
                break;
            case PlayerState.Moving:
                OnMouseEvent_IdleRun(evt);
                break;
            case PlayerState.SKill:
                {
                    if (evt == Define.MouseEvent.PointerUp)
                        _stopSkill = true;
                }
                break;
        }
        
                    
    }

기존에 OnMouseEvent에 있던 코드를 OnMouseEvent_IdleRun()으로 이동하였다.

void OnMouseEvent_IdleRun(Define.MouseEvent evt)
    {
        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;
                    // 처음은 공격가능한 상태로 표기한다.
                    _stopSkill = false;
                    if (hit.collider.gameObject.layer == (int)Define.Layer.Monster)
                        _lockTarget = hit.collider.gameObject;
                    else
                        _lockTarget = null;
                }
                break;
            // 누르는 동안 일어나는 이벤트
            case Define.MouseEvent.Press:
                if (_lockTarget == null && raycastHit)
                    _destPos = hit.point;                
                break;
            // 버튼을 떼면 공격모션을 취소해야한다.
            case Define.MouseEvent.PointerUp:
                _stopSkill = true;
                break;
        }
    }
public PlayerState State
    {
        get { return _state; }
        set
        {
            _state = value;

            Animator anim = GetComponent<Animator>();

            switch (_state)
            {
                case PlayerState.Die:                    
                    break;
                case PlayerState.Idle:
                    anim.CrossFade("WAIT", 0.1f);
                    break;
                case PlayerState.Moving:
                    anim.CrossFade("RUN", 0.1f);
                    break;
                case PlayerState.SKill:
                    anim.CrossFade("ATTACK", 0.1f, -1, 0);
                    break;

            }
        }
    }

애니메이터에서 Parameter와 Transtion을 다 제거하였다.

이후 애니메이션은 CrossFade함수를 통해 실행하도록 하였다.

프리팹에 무기 추가


다른 어셋에서 무기를 추출해서 플레이어에 달아주었다.

실행 결과

애니메이션이 잘 작동하고 타겟을 바라보는 것 까지 완성되었다.

0개의 댓글