/// <summary> /// 转换状态 /// </summary> /// <param name="aiRule"></param> public void PerformRule(AIrule aiRule) { if (aiRule == AIrule.NullAIrule) { Debug.LogError("PerformRule Error:NullAIrule"); return; } AIEvent aiEvent = currentAIFSM.GetOutputState(aiRule); if (aiEvent == AIEvent.NullEvent) { Debug.LogError("PerformRule Error:NullEvent"); return; } currentAIEvent = aiEvent; for (int i = 0; i < aiFSMs.Count; i++) { if (aiFSMs[i].AiEvent == currentAIEvent) { currentAIFSM.DoBeforeLeaving(); currentAIFSM = aiFSMs[i]; currentAIFSM.DoBeforeEntering(); return; } } }
/// <summary> /// 初始化状态机 /// </summary> public void InitializeFSM() { ai_fsm = new AIFSM(AIFSM_Type.EnemyFSM, this); StateNotReady _startState = new StateNotReady(); ai_fsm.AddStateToList(_startState); ai_fsm.AddStateToList(new StateIdle()); ai_fsm.AddStateToList(new StateAttack()); ai_fsm.AddStateToList(new StateDeath()); ai_fsm.SetDefaultState(_startState); }
protected virtual void Awake() { if (_animator == null) { _animator = GetComponentInChildren <Animator>(); } _fsm = new AIFSM(new AIIdleState(), this); _fsm.onStateChanged += OnFSMStateChanged; _fsm.onStateErrorOccurred += OnFSMStateErrorOccurred; _fsm.onStateComplete += OnFSMStateComplete; }
public override void EnterState() { _childFSM = new AIFSM(new AIIdleState(), Agent); _childFSM.onStateComplete += StateComplete; if (_wanderArea.Contains(Agent.transform.position)) { DestinationReached(); } else { Pathfinder.Instance.FindPath(Agent.GetHashCode(), Agent.transform.position, GetRandomPositionInArea(), PathFound); } }
void Start() { // Start up the FSM aiStateMachine = new AIFSM("BaseController of " + gameObject.name, this); aiStateMachine.Start(EAIState.IDLE); // Cache a ref to our controlled character character = gameObject.GetComponent <BaseEnemyCharacter>(); character.gameObject.GetComponent <Health>().OnNoHealth.AddListener(OnCharacterDied); // Grab our nav mesh agent agent = gameObject.GetComponent <NavMeshAgent>(); // Bind to perception events eyes = GetComponentInChildren <Perception>(); eyes.OnSeenTarget.AddListener((newTarget) => { SeePlayer(newTarget); }); eyes.OnLostTarget.AddListener(LostPlayer); }
/// <summary> /// 添加一个新状态 /// </summary> /// <param name="aiFSM"></param> public void AddAIFSM(AIFSM aiFSM, AIManager manager) { if (aiFSM == null) { Debug.LogError("AddAIFSM Error:为空的AIFSM不被允许添加!"); return; } for (int i = 0; i < aiFSMs.Count; i++) { if (aiFSMs[i].AiEvent == aiFSM.AiEvent) { Debug.LogError("AddAIFSM Error:" + aiFSM.AiEvent.ToString() + "在列表中已存在!"); return; } } aiFSM._AIManager = manager; aiFSMs.Add(aiFSM); }
public AggressiveState(AIFSM parent, EAIState ID, string prettyID, EnemyController controller) : base(parent, ID, prettyID, controller) { }
public AlertState(AIFSM parent, EAIState ID, string prettyID, EnemyController controller) : base(parent, ID, prettyID, controller, controller.AlertDelay) { }
public override void EnterState() { _childFSM = new AIFSM(new AIIdleState(), Agent); _childFSM.onStateComplete += substateComplete; playBuildAnim(); }
/// <summary> /// 设置当前状态 /// </summary> /// <param name="aiFSM"></param> public void SetCurrentAIFSM(AIFSM aiFSM) { currentAIFSM = aiFSM; currentAIEvent = aiFSM.AiEvent; CurrentAIFSM.DoBeforeEntering(); }
private void Awake() { _fsm = GetComponent <AIFSM>(); _navMeshAgent = GetComponent <NavMeshAgent>(); _sensor = GetComponent <Sensor>(); }