Unity3D_MMO - 몬스터 (2)

k_hyun·2022년 10월 21일
0

Unity_MMO_Project

목록 보기
30/33

MonsterController.cs

[SerializeField]
float _scanRange = 3.0f;

[SerializeField]
float _attackRange = 1.0f;

몬스터가 플레이어를 감지하고 공격하는 거리를 정하였다.

    protected override void UpdateIdle()
    {        

        // 플레이어를 찾고, 사정거리 내에 있으면 State를 Moving으로 변경
        GameObject player = GameObject.FindGameObjectWithTag("Player");
        if (player == null)
            return;

        float distance = (player.transform.position - transform.position).magnitude;

        if (distance <= _scanRange)
        {
            
            _lockTarget = player;
            State = Define.State.Moving;
            return;
        }
    }

Idle 상태에서 플레이어가 사정거리 내에 있으면 상태를 Moving으로 변경한다.

 protected override void UpdateMoving()
    {
        // 플레이어가 사정거리 내면 공격
        if (_lockTarget != null)
        {
            _destPos = _lockTarget.transform.position;
            float dist = (_destPos - transform.position).magnitude;
            if (dist <= _attackRange)
            {
                // 공격상태가 되면 이동을 멈춘다.
                NavMeshAgent nma = gameObject.GetOrAddCompoent<NavMeshAgent>();
                nma.SetDestination(transform.position);
                State = Define.State.SKill;
                return;
            }
        }

        // 이동
        Vector3 dir = _destPos - transform.position;
        if (dir.magnitude < 0.01f)
            State = Define.State.Idle;
        else
        {
            // NavMeshAgent를 사용한 이동
            NavMeshAgent nma = gameObject.GetOrAddCompoent<NavMeshAgent>();
            // 목적지를 설정하면 해당한 곳으로 이동
            nma.SetDestination(_destPos);
            nma.speed = _stat.MoveSpeed;

            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir), 10 * Time.deltaTime);
        }
    }

사정거리 내인 경우 공격을 시작한다.

그렇지 않은 경우 플레이어를 향해 이동한다.

void OnHitEvent()
    {
        if (_lockTarget != null)
        {
            Stat targetStat = _lockTarget.GetComponent<Stat>();
            Stat myStat = gameObject.GetComponent<Stat>();
            int damage = Mathf.Max(0, myStat.Attack - targetStat.Defense);
            targetStat.Hp -= damage;

            if (targetStat.Hp > 0)
            {
                float distance = (_lockTarget.transform.position - transform.position).magnitude;
                if (distance <= _attackRange)
                    State = Define.State.SKill;
                else
                    State = Define.State.Moving;
            }
            else
            {
                State = Define.State.Moving;
            }
        }
        else
        {
            State = Define.State.Idle;
        }

    }

공격 애니메이션을 취할때 사용하는 이벤트 함수이다.

몬스터가 플레이어를 공격하면 플레이어의 hp를 깎는다.

또한 피 상태에 따라서 몬스터의 상태를 변경한다.

실행 결과

업로드중..
몬스터가 잘 따라와서 플레이어를 공격한다.

0개의 댓글