예제 #1
0
        /// <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);
        }
예제 #2
0
 /// <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);
 }
예제 #3
0
        /// <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);
            }
        }
예제 #4
0
        /// <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);
                }
            }
        }
예제 #5
0
        /// <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");
        }
예제 #6
0
        /// <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();
        }
예제 #7
0
 /// <summary>
 /// 删除转换条件对象
 /// </summary>
 /// <param name="transitionID"></param>
 private void RemoveTransitionObject(FSMTransitionID transitionID)
 {
     transitions.RemoveAll(t => t.TransitionID == transitionID);
 }
예제 #8
0
 /// <summary>
 /// 执行转换,fSMSystem.PerformTransition
 /// </summary>
 /// <param name="transitionID"></param>
 public void PerformTransition(FSMTransitionID transitionID)
 {
     fSMSystem.PerformTransition(transitionID);
 }