public void BindBehaviour(YuAIBehaviorBase behaviour)
 {
     BindingBehaviour        = behaviour;
     NodeType                = behaviour.BehaviourDes;
     CurState                = behaviour.CurState;
     behaviour.OnStateChange = SetState;
 }
        //条件
        //private  bool Condition

        protected override AIBehaviorState Update()
        {
            AIBehaviorState state = base.Update();

            //Todo 加入条件测试,不满足则马上跳出

            return(state);
        }
 /// <summary>
 /// 手动停止行为的运行,并设置状态为终止
 /// </summary>
 public void StopRunning()
 {
     if (curState == AIBehaviorState.Running)
     {
         CurState = AIBehaviorState.Aborted;
         Exit();
     }
 }
 /// <summary>
 /// 执行
 /// </summary>
 /// <returns></returns>
 public AIBehaviorState Tick()
 {
     if (CurState != AIBehaviorState.Running)
     {
         Enter();
     }
     CurState = Update();
     if (CurState != AIBehaviorState.Running)
     {
         Exit();
     }
     return(CurState);
 }
 protected override AIBehaviorState Update()
 {
     while (curChildActionIndex < childendBehaviors.Count)
     {
         AIBehaviorState state = childendBehaviors[curChildActionIndex].Tick();
         //如果还未执行成功了就返回相应状态
         if (state != AIBehaviorState.Success)
         {
             return(state);
         }
         //执行成功了继续执行下一个行为
         curChildActionIndex++;
     }
     //执行全部完成则返回成功
     return(AIBehaviorState.Success);
 }
        protected override AIBehaviorState Update()
        {
            //保存当前行为节点
            int lastChildIndex = m_curChildIndex;

            base.Enter();       //重新从第一个(最高优先级)子行为开始运行:(m_curChildIndex = 0)
            AIBehaviorState stateResult = base.Update();

            //如果当前节点前面的节点能执行,或是当前节点失败,运行到了后面的节点,则终止当前节点的执行
            if (m_curChildIndex != lastChildIndex &&
                lastChildIndex > 0 && lastChildIndex < childendBehaviors.Count)    //安全判断
            {
                childendBehaviors[lastChildIndex].StopRunning();
            }

            return(stateResult);
        }
Exemplo n.º 7
0
        //注意派生类不能再继承Update(),而要继承OnUpdate();
        protected override AIBehaviorState Update()
        {
            AIBehaviorState state = OnUpdate();

            if (m_isNegation)
            {
                if (state == AIBehaviorState.Failure)
                {
                    return(AIBehaviorState.Success);
                }
                if (state == AIBehaviorState.Success)
                {
                    return(AIBehaviorState.Failure);
                }
            }
            return(state);
        }
        protected override AIBehaviorState Update()
        {
            while (true)
            {
                //执行全部完成则返回失败
                if (m_curChildIndex >= childendBehaviors.Count)
                {
                    return(AIBehaviorState.Failure);
                }

                AIBehaviorState state = childendBehaviors[m_curChildIndex].Tick();
                //如果一个子行为未失败,则返回相应状态
                if (state != AIBehaviorState.Failure)
                {
                    return(state);
                }
                //失败了则执行下一个
                m_curChildIndex++;
            }
        }
        private void SetState(AIBehaviorState state)
        {
            if (CurState != state)
            {
                CurState   = state;
                stateCount = 0;
            }
            else
            {
                stateCount = (stateCount + 1) % 3;
            }
            switch (CurState)
            {
            case AIBehaviorState.Success:
                StateStr = Success + dot[stateCount];
                break;

            case AIBehaviorState.Failure:
                StateStr = Failure + dot[stateCount];
                break;
            }
        }
 /// <summary>
 /// 重置,重新设为初始状态
 /// </summary>
 public void Reset()
 {
     curState = AIBehaviorState.Invalid;
 }
 public YuAIBehaviorBase()
 {
     curState = AIBehaviorState.Invalid;
 }
Exemplo n.º 12
0
        protected override AIBehaviorState Update()
        {
            int  successCount = 0, failureCount = 0;
            int  childernCount = childendBehaviors.Count;
            bool isTerminate   = true;


            for (int i = 0; i < childernCount; i++)
            {
                if (!childendBehaviors[i].IsTerminate())   //还未结束
                {
                    isTerminate = false;
                    childendBehaviors[i].Tick();
                }

                AIBehaviorState state = childendBehaviors[i].CurState;
                if (state == AIBehaviorState.Success)
                {
                    if (m_successPolicy == EPolicy.RequireOne)
                    {
                        childendBehaviors[i].Reset();
                        return(AIBehaviorState.Success);
                    }
                    successCount++;
                }
                else if (state == AIBehaviorState.Failure)
                {
                    if (m_failurePolicy == EPolicy.RequireOne)
                    {
                        childendBehaviors[i].Reset();
                        return(AIBehaviorState.Failure);
                    }
                    failureCount++;
                }
            }

            if (m_failurePolicy == EPolicy.RequireAll &&
                failureCount == childernCount)
            {
                for (int i = 0; i < childernCount; i++)
                {
                    childendBehaviors[i].Reset();
                }
                return(AIBehaviorState.Failure);
            }

            if (m_successPolicy == EPolicy.RequireAll &&
                successCount == childernCount)
            {
                for (int i = 0; i < childernCount; i++)
                {
                    childendBehaviors[i].Reset();
                }
                return(AIBehaviorState.Success);
            }

            //已经结束所有的行为,但未判定是成功还是失败(条件是全部成功/全部失败)
            if (isTerminate)
            {
                return(AIBehaviorState.Aborted);
            }

            return(AIBehaviorState.Running);
        }