/// <summary> /// 增加映射对 /// </summary> /// <param name="transitionID">转换条件ID</param> /// <param name="stateID">下一个转台ID</param> public void AddTransition(FSMTransitionID transitionID, FSMStateID stateID) { // 判空 if (transitionID == FSMTransitionID.NullTransition) { Debug.LogError("FSMState ERROR: NullTransition is not allowed for a real transition"); return; } if (stateID == FSMStateID.NullState) { Debug.LogError("FSMState ERROR: NullStateID is not allowed for a real ID"); return; } // 已经存在 if (map.ContainsKey(transitionID)) { Debug.LogError("FSMState ERROR: State " + this.stateID.ToString() + " already has transition " + transitionID.ToString() + "Impossible to assign to another state"); return; } map.Add(transitionID, stateID); AddTransitionObject(transitionID); }
/// <summary> /// 根据转换条件获得下一个状态ID /// </summary> /// <param name="transitionID"></param> /// <returns>不存在转换映射将返回NUllStateID</returns> public FSMStateID GetOutputState(FSMTransitionID transitionID) { // 存在转换映射 if (map.ContainsKey(transitionID)) { return(map[transitionID]); } return(FSMStateID.NullState); }
/// <summary> /// 添加转换条件对象 /// </summary> /// <param name="transitionID"></param> private void AddTransitionObject(FSMTransitionID transitionID) { //反射,命名规则:所有Transition都以对应的TransitionID+Transition命名 Type type = Type.GetType("Mystery.FSM." + transitionID + "Transition"); if (type != null) { System.Object[] param = new System.Object[1] { nPC }; FSMTransition transitionObj = Activator.CreateInstance(type, param) as FSMTransition; transitions.Add(transitionObj); } }
/// <summary> /// 配置,添加状态和转换 /// </summary> public void ConfigFSM(string filename) { //反射 System.Object[] param = new System.Object[1] { nPC }; var map = FSMConfigurationReader.ReadCongfig(filename); List <FSMStateID> anyStateNextStates = new List <FSMStateID>(); List <FSMTransitionID> anyStateTrans = new List <FSMTransitionID>(); int anyTransCount = 0; foreach (string stateID in map.Keys) { if (stateID == "Any") { // 特殊处理 // 每个状态都要添加这个"Any"下的所有转换(需要写在配置表开头),同样不需要状态实体 // 同时可能需要添加NPC的状态变量如hp foreach (string transitionID in map[stateID].Keys) { FSMTransitionID t = (FSMTransitionID)Enum.Parse(typeof(FSMTransitionID), transitionID); FSMStateID s = (FSMStateID)Enum.Parse(typeof(FSMStateID), map[stateID][transitionID]); anyStateNextStates.Add(s); anyStateTrans.Add(t); } anyTransCount = anyStateTrans.Count; continue; } Type type = Type.GetType(curNamespaceDot + stateID + "State"); FSMState state = Activator.CreateInstance(type, param) as FSMState; AddState(state); // 先添加anystate的转换 for (int i = 0; i < anyTransCount; i++) { state.AddTransition(anyStateTrans[i], anyStateNextStates[i]); } // 再添加这个状态的 foreach (string transitionID in map[stateID].Keys) { FSMTransitionID t = (FSMTransitionID)Enum.Parse(typeof(FSMTransitionID), transitionID); FSMStateID s = (FSMStateID)Enum.Parse(typeof(FSMStateID), map[stateID][transitionID]); state.AddTransition(t, s); } } }
/// <summary> /// 删除映射对 /// </summary> public void RemoveTransition(FSMTransitionID transitionID) { // 判空 if (transitionID == FSMTransitionID.NullTransition) { Debug.LogError("FSMState ERROR: NullTransition is not allowed"); return; } // 确实存在 if (map.ContainsKey(transitionID)) { map.Remove(transitionID); RemoveTransitionObject(transitionID); return; } Debug.LogError("FSMState ERROR: Transition " + transitionID.ToString() + " passed to " + stateID.ToString() + " was not on the state's transition list"); }
/// <summary> /// 执行状态转换,当前+条件->下一个 /// </summary> public void PerformTransition(FSMTransitionID trans) { // 判空 if (trans == FSMTransitionID.NullTransition) { Debug.LogError("FSM ERROR: NullTransition is not allowed for a real transition"); return; } // 尝试获取下一个状态ID FSMStateID nextStateID = currentState.GetOutputState(trans); if (nextStateID == FSMStateID.NullState) { Debug.LogError("FSM ERROR: State " + currentStateID.ToString() + " does not have a target state " + " for transition " + trans.ToString()); return; } // 获取下一个状态 FSMState nextState = null; if (nextStateID == FSMStateID.Default) { nextState = defaultState; } else { nextState = states.Find(s => s.StateID == nextStateID); } // 更新状态 currentState.DoBeforeLeaving(); if (!currentState.isFinished) { SavePreviousState(); } currentState = nextState; currentStateID = nextState.StateID; currentState.DoBeforeEntering(); }
/// <summary> /// 删除转换条件对象 /// </summary> /// <param name="transitionID"></param> private void RemoveTransitionObject(FSMTransitionID transitionID) { transitions.RemoveAll(t => t.TransitionID == transitionID); }
/// <summary> /// 执行转换,fSMSystem.PerformTransition /// </summary> /// <param name="transitionID"></param> public void PerformTransition(FSMTransitionID transitionID) { fSMSystem.PerformTransition(transitionID); }