Пример #1
0
    private IEnumerator AttackBehaviour(BaseBrain brain)
    {
        int         actionId          = 0;
        IEnumerator action            = null;
        bool        executeNextAction = true;

        while (brain.Target != null)
        {
            //Check distance
            if (Vector3.Distance(brain.transform.position, brain.Target.transform.position) > brain.navMeshAgent.stoppingDistance)
            {
                brain.ChangeState(typeof(BaseChaseState));
            }

            if (executeNextAction)
            {
                action = action.ActWithDelay(() => actions[actionId].DoAction(brain),  //execute next action
                                             state => executeNextAction = state,       //Check if execution complete
                                             0,                                        //time delay before
                                             attackInterval[actionId]);                //time delay after

                brain.StartCoroutine(action);
                actionId          = (actionId + 1) % actions.Length;
                executeNextAction = false;
            }
            yield return(null);
        }

        brain.StopCoroutine(action);
        brain.changeStatePossible = true;
        yield return(null);

        brain.ChangeState(typeof(BaseTargetLostState));
    }