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(); }