Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
    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);
    }