Beispiel #1
0
    // Update is called once per frame
    void Update()
    {
        if (!GetReady())
        {
            return;
        }

        Behavior behavior = null;

        if (_behaviors.Count < MAX_BEHAVIORS)
        {
            foreach (UnitCommand cmd in _commands)
            {
                if (_behaviors.Count > 0)
                {
                    behavior = _behaviors.Peek();
                    if (behavior.IsForced() && !cmd._forced)
                    {
                        continue;
                    }
                }

                if (ProcessCommand(cmd))
                {
                    _commands.Erase(cmd);
                    break;
                }
                else
                {
                    _commands.Erase(cmd);
                    continue;
                }
            }
        }

        if (_behaviors.Count > 0)
        {
            behavior = _behaviors.Peek();

            if (behavior.GetBrain() != this)
            {
                Debug.LogWarning("Behavior's unit does not match it's owner's unit");
            }
            if (behavior.GetSelf() != _unit)
            {
                Debug.LogWarning("Behavior's unit does not match brain's unit, the behavior will try to control a different unit");
            }

            if (behavior.Validate())
            {
                if ((behavior.GetFlags() & Behavior.BSR_NEW) != 0)
                {
                    behavior.BeginBehavior();
                }
                else
                {
                    behavior.Update();
                }
            }

            if (behavior.IsEnd())
            {
                behavior.EndBehavior();

                //这里根据toll判断是否可以被打断
                bool nonInterupting = false;

                _behaviors.Dequeue();

                //reset next behavior
                if (_behaviors.Count > 0 && _behaviors.Peek().ShouldReset() && !nonInterupting)
                {
                    _behaviors.Peek().Reset();
                }
            }
        }

        bool isProcessed = false;

        for (int i = 0; i < (int)EActionStateIDs.ASID_COUNT; ++i)
        {
            if (_actionStates[i].IsActive())
            {
                if (!_actionStates[i].ContinueStateAction())
                {
                    _actionStates[i].EndState(3);
                }
                else
                {
                    isProcessed = true;
                }
            }
        }
        if (isProcessed == false)
        {
            UnpauseNextActionState();
        }
    }