public override void ExecuteTactic(ImpAi imp) { if (_imp == null) { _imp = imp; //_contextGroupFormation = imp.GetComponent<ContextGroupFormation>(); _impRecruitBehaviour = imp.GetComponent <ImpRecruitBehaviour>(); BtAction startRecruit = new BtAction(StartRecruit); BtAction stopRecruit = new BtAction(StopRecruit); //BtCondition inPositionCondition = new BtCondition(InPosition); BtCondition isRecruiting = new BtCondition(() => _isRecruiting); BtCondition isNotRecruiting = new BtCondition(() => !_isRecruiting); BtSelector startRecruitSelector = new BtSelector(new IBtTask[] { isRecruiting, startRecruit }); BtSelector stopRecruitSelector = new BtSelector(new IBtTask[] { isNotRecruiting, stopRecruit }); BtSequence startRecruitSequence = new BtSequence(new IBtTask[] { startRecruitSelector }); BtSelector recruitTree = new BtSelector(new IBtTask[] { startRecruitSequence, stopRecruitSelector }); _recruitBehaviourTree = new BehaviourTree(recruitTree); } _recruitBehaviourTree.Run(); }
private void Start() { foreach(GameObject group in GroupsManager.Instance.Groups.Values) { _groupAggros.Add(group.GetComponent<GroupAggro>()); } #region Behaviour tree #region Target selection BtCondition isTargetStillValid = new BtCondition(() => _currentTargetStillValid); BtAction tryChooseByAggro = new BtAction(TryChooseByAggro); BtSequence byAggroSequence = new BtSequence(new IBtTask[] { tryChooseByAggro }); BtSelector targetSelection = new BtSelector(new IBtTask[] { isTargetStillValid, byAggroSequence }); #endregion #region Attack BtCondition lastAttackDone = new BtCondition(() => _lastAttackDone); BtCondition isFacingTarget = new BtCondition(IsFacingTarget); BtCondition inAttackRange = new BtCondition(InAttackRange); BtAction chooseAttack = new BtAction(ChooseAttack); BtAction attack = new BtAction(Attack); BtSequence attackSequence = new BtSequence(new IBtTask[] { lastAttackDone, isFacingTarget, inAttackRange, chooseAttack, attack }); #endregion BtSequence combatSequence = new BtSequence(new IBtTask[] { targetSelection, attackSequence }); #endregion #region FSM FSMState idle = new FSMState(); FSMState combat = new FSMState(); combat.enterActions.Add(StartCombat); FSMTransition battleEnter = new FSMTransition(() => _inCombat); idle.AddTransition(battleEnter, combat); #endregion _combatBehaviourTree = new BehaviourTree(combatSequence); _bossFsm = new FSM(idle); _runFsmCoroutine = StartCoroutine(BossFsmUpdate()); }