예제 #1
0
        public IEnumerator Execute()
        {
            while (owner.StateMachine.CurrentState is PatrolState)
            {
                var isPatrol = Random.Range(1, 3) == 1;
                if (isPatrol)
                {
                    var startPos      = owner.transform.position;
                    var numberOfMoves = Random.Range(1, 10);
                    while (numberOfMoves > 0)
                    {
                        EnemyAnimations.ResetAllAnimParameters(owner);
                        EnemyAnimations.SetAnimation(owner, "Walk");
                        var dest = startPos + new Vector3(Random.Range(-10f, 10f), 0, Random.Range(-10f, 10f));
                        agent.SetDestination(dest);
                        var time = (dest - owner.transform.position).magnitude / agent.speed;
                        yield return(new WaitForSeconds(time));

                        numberOfMoves--;
                    }
                }
                else
                {
                    agent.ResetPath();
                    EnemyAnimations.ResetAllAnimParameters(owner);
                    EnemyAnimations.SetAnimation(owner, "Idle");
                    yield return(new WaitForSeconds(ownerChillTime));
                }
            }
        }
예제 #2
0
 public IEnumerator Execute()
 {
     EnemyAnimations.ResetAllAnimParameters(owner);
     EnemyAnimations.SetAnimation(owner, "Walk");
     while (owner.StateMachine.CurrentState is ChasingState)
     {
         LookAt(player);
         agent.SetDestination(player.position);
         yield return(null);
     }
 }
예제 #3
0
        public IEnumerator Execute()
        {
            agent.ResetPath();

            if (owner.EnemySo.TypeEnemy == EnemySO.EnemyType.Ranged)
            {
                Coroutine lookAtCoroutine = null;
                while (owner.StateMachine.CurrentState is AttackState)
                {
                    EnemyAnimations.ResetAllAnimParameters(owner);
                    EnemyAnimations.SetAnimation(owner, "Attack");
                    if (!(lookAtCoroutine is null))
                    {
                        owner.StopCoroutine(lookAtCoroutine);
                    }
                    lookAtCoroutine = owner.StartCoroutine(LookAtPlayer(player));

                    if (Physics.Raycast(owner.transform.position, owner.transform.TransformDirection(Vector3.forward), out var hit,
                                        layerMask))
                    {
                        owner.Line.SetPosition(0, owner.transform.position);
                        owner.Line.SetPosition(1, hit.point);

                        if (hit.transform.TryGetComponent <PlayerHealth>(out var plHealth))
                        {
                            plHealth.playerHealthDecrease.Invoke(owner.EnemyRaw.Damage);
                        }
                    }
                    else
                    {
                        owner.Line.SetPosition(0, owner.transform.position);
                        owner.Line.SetPosition(1, owner.transform.TransformDirection(Vector3.forward));
                    }

                    yield return(new WaitForSeconds(ownerAnimator.GetCurrentAnimatorStateInfo(0).length));
                }