static public TBTAction GetBehaviorTreeAction() { if (_bevTreeAct != null) { return(_bevTreeAct); } _bevTreeAct = new TBTActionPrioritizedSelector(); // _bevTreeAct.AddChild(new TBTActionSequence() // .SetPrecondition(new TBTPreconditionNOT(new CON_HasReachedTarget())) // .AddChild(new NOD_TurnTo()) // .AddChild(new NOD_MoveTo())) // .AddChild(new NOD_Attack()); TBTActionSequence actionSequence = new TBTActionSequence(); _bevTreeAct.AddChild(actionSequence); CON_HasReachedTarget hasReachedTarget = new CON_HasReachedTarget(); TBTPreconditionNOT preconditionNOT = new TBTPreconditionNOT(hasReachedTarget); actionSequence.SetPrecondition(preconditionNOT); NOD_TurnTo turnTo = new NOD_TurnTo(); NOD_MoveTo moveTo = new NOD_MoveTo(); NOD_Attack attackTo = new NOD_Attack(); actionSequence.AddChild(turnTo); actionSequence.AddChild(moveTo); actionSequence.AddChild(attackTo); return(_bevTreeAct); }
public static TBTActionPrioritizedSelector GetBehaviorTree() { if (m_BehaviorTreeNode == null) { // 父节点 m_BehaviorTreeNode = new TBTActionPrioritizedSelector(); // 设置idle节点 var setUnitIdleNode = new NOD_SetUnitIdle(); // 转向节点 var turnToSelectorNode = new TBTActionPrioritizedSelector(); turnToSelectorNode.SetPrecondition(new CON_IsAngleNeedTurnTo()); turnToSelectorNode.AddChild(new NOD_TurnTo()); //todo can turn to turnToSelectorNode.AddChild(setUnitIdleNode); // 追逐节点 var moveToSelectorNode = new TBTActionPrioritizedSelector(); moveToSelectorNode.SetPrecondition(new CON_IsInRange()); moveToSelectorNode.AddChild(new NOD_MoveTo()); //todo can Move to moveToSelectorNode.AddChild(setUnitIdleNode); // ①追逐 TBTAction chaseSelectorNode = new TBTActionPrioritizedSelector().SetPrecondition(new CON_IsChaseRequest()); chaseSelectorNode.AddChild(turnToSelectorNode); chaseSelectorNode.AddChild(moveToSelectorNode); // ②自动战斗节点构建 // 转向和追逐并行 var abilityTurnMoveToParallelNode = new TBTActionParallel(); // 技能转向节点 TBTPreconditionAND abilityTurnCondition = new TBTPreconditionAND(new CON_IsAbilityNeedTurnTo(), new CON_IsAngleNeedTurnTo()); abilityTurnMoveToParallelNode.AddChild(new NOD_TurnTo().SetPrecondition(abilityTurnCondition)); // 技能追逐节点 TBTPreconditionNOT abilityMoveCondition = new TBTPreconditionNOT(new CON_IsInAbilityRange()); abilityTurnMoveToParallelNode.AddChild(new NOD_MoveTo().SetPrecondition(abilityMoveCondition)); abilityTurnMoveToParallelNode.SetEvaluationRelationship(TBTActionParallel.ECHILDREN_RELATIONSHIP.OR); // 技能施法节点 var castAbilitySelectorNode = new TBTActionPrioritizedSelector(); castAbilitySelectorNode.SetPrecondition(new CON_CanCastAbility()); castAbilitySelectorNode.AddChild(new NOD_CastAbility()); castAbilitySelectorNode.AddChild(setUnitIdleNode); var autoCastAbilityNode = new TBTActionPrioritizedSelector().SetPrecondition(new CON_IsAutoCastAbilityRequest()); // 转向、移动、施法 autoCastAbilityNode.AddChild(abilityTurnMoveToParallelNode); autoCastAbilityNode.AddChild(castAbilitySelectorNode); /// 开始构造树 m_BehaviorTreeNode.AddChild(chaseSelectorNode); m_BehaviorTreeNode.AddChild(autoCastAbilityNode); } return(m_BehaviorTreeNode); }