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); }
//注意派生类不能再继承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; }
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); }