Esempio n. 1
0
    public void InitBehaviourTree()
    {
        // ********************
        // Initialise Blackboard and store data for later use
        // ********************
        bb = new Blackboard();
        bb.AddData(_agentData.EnemyFlagName, GameObject.Find(_agentData.EnemyFlagName));
        bb.AddData(_agentData.FriendlyFlagName, GameObject.Find(_agentData.FriendlyFlagName));
        bb.AddData(_agentData.EnemyBase.name, GameObject.Find(_agentData.EnemyBase.name));
        bb.AddData(_agentData.FriendlyBase.name, GameObject.Find(_agentData.FriendlyBase.name));
        bb.AddData(Names.HealthKit, GameObject.Find(Names.HealthKit));
        bb.AddData(Names.PowerUp, GameObject.Find(Names.PowerUp));
        bb.AddData("HasEnemyFlag", _agentData.HasEnemyFlag);
        bb.AddData("HasFriendlyFlag", _agentData.HasFriendlyFlag);
        bb.AddData("EnemyFlagCarrier", enemyFlagCarrier);

        enemyFlag    = (GameObject)bb.GetData(_agentData.EnemyFlagName);
        friendlyFlag = (GameObject)bb.GetData(_agentData.FriendlyFlagName);
        enemyBase    = (GameObject)bb.GetData(_agentData.EnemyBase.name);
        friendlyBase = (GameObject)bb.GetData(_agentData.FriendlyBase.name);

        // ********************
        // Composite Nodes
        // ********************
        Sequence mainEntryLoop  = new Sequence(true);
        Selector selecMainEntry = new Selector();
        Sequence seqStealFlag   = new Sequence();
        Sequence seqCarryFlag   = new Sequence();
        Sequence seqAttack      = new Sequence();

        Sequence seqRecoverFlag   = new Sequence();
        Selector selecRecoverFlag = new Selector();
        Sequence seqRecoverPathA  = new Sequence();
        Sequence seqRecoverPathB  = new Sequence();

        // ********************
        // Node connections
        // ********************
        mainEntryLoop.AddNode(selecMainEntry);
        mainEntryLoop.AddNode(new Repeater(mainEntryLoop));

        selecMainEntry.AddNode(seqStealFlag);
        selecMainEntry.AddNode(seqCarryFlag);
        selecMainEntry.AddNode(seqRecoverFlag);

        AttackNearbyEnemy attackNode = new AttackNearbyEnemy(_agentActions, _agentSenses, 0);

        seqAttack.AddNode(attackNode);
        seqAttack.AddNode(new RepeatUntilNodeFails(attackNode));

        seqStealFlag.AddNode(new GoToRandomPos(_agentActions));
        seqStealFlag.AddNode(new Wait(2));
        seqStealFlag.AddNode(new ComparePosition(enemyFlag, enemyBase, 5));
        seqStealFlag.AddNode(new GoToPos(this, _agentActions, enemyBase, 2, seqAttack));
        seqStealFlag.AddNode(new IsItemInView(_agentSenses, enemyFlag));
        seqStealFlag.AddNode(new GoToPos(this, _agentActions, enemyFlag));
        seqStealFlag.AddNode(new CollectItem(_agentActions, _agentSenses, _agentInventory, enemyFlag));

        seqCarryFlag.AddNode(new IsCarryingEnemyFlag(_agentData));
        seqCarryFlag.AddNode(new GoToRandomPos(_agentActions));
        seqCarryFlag.AddNode(new Wait(1));
        seqCarryFlag.AddNode(new GoToPos(this, _agentActions, friendlyBase, 2));
        seqCarryFlag.AddNode(new DropItem(_agentActions, enemyFlag));

        seqRecoverFlag.AddNode(new Inverter(new ComparePosition(friendlyFlag, friendlyBase, 5)));
        seqRecoverFlag.AddNode(selecRecoverFlag);
        selecRecoverFlag.AddNode(seqRecoverPathA);
        selecRecoverFlag.AddNode(seqRecoverPathB);

        seqRecoverPathA.AddNode(new GetEnemyFlagCarrier(this, bb));
        seqRecoverPathA.AddNode(new GoToPos(this, _agentActions, "EnemyFlagCarrier", bb));
        seqRecoverPathA.AddNode(attackNode);

        seqRecoverPathB.AddNode(new GoToPos(this, _agentActions, friendlyFlag));
        seqRecoverPathB.AddNode(new IsItemInView(_agentSenses, friendlyFlag));
        seqRecoverPathB.AddNode(new CollectItem(_agentActions, _agentSenses, _agentInventory, friendlyFlag));
        seqRecoverPathB.AddNode(new GoToPos(this, _agentActions, friendlyBase, 2));
        seqRecoverPathB.AddNode(new DropItem(_agentActions, friendlyFlag));

        // ********************
        // Set root node here and start tree
        // ********************
        myTree = new BehaviourTree(mainEntryLoop, this);
        myTree.Traverse();
    }