示例#1
0
        /// <summary>
        /// 设置在指定状态下满足特定条件时(中断)并转移到终点状态。
        /// </summary>
        /// <param name="from">起点状态。</param>
        /// <param name="to">终点状态。</param>
        /// <param name="connectionType">从上一个状态迁移到下一个状态的条件(条件、事件、状态结束)。</param>
        /// <param name="warnOverride">重复设置时是否发出警告。</param>
        /// <param name="dic">储存设置的字典。</param>
        /// <param name="path">从起点到终点经过的路径。</param>
        /// <typeparam name="T">导致转移发生的条件。</typeparam>
        private void Link <T>(FsmState from,
                              FsmState to,
                              T connectionType,
                              bool warnOverride,
                              Dictionary <FsmState, Dictionary <T, ToAndList> > dic,
                              params FsmState[] path)
        {
            Dictionary <T, ToAndList> connections;

            // 没有 from 键,新建一个
            if (!dic.TryGetValue(from, out connections))
            {
                connections = new Dictionary <T, ToAndList>();
                connections.Add(connectionType, new ToAndList(to, path));
                dic.Add(from, connections);
                return;
            }

            ToAndList toAndList;

            // 没有 connectionType 键,新建一个
            if (!connections.TryGetValue(connectionType, out toAndList))
            {
                toAndList = new ToAndList(to, path);
                connections.Add(connectionType, toAndList);
                return;
            }

            if (toAndList.To != to)
            {
                throw new Exception(string.Format(
                                        "Try to override exist connection:\n{0} --> {2} : {1}\n{0} --> {3} : {1}\n",
                                        from.GetType().Name,
                                        connectionType.GetType().Name,
                                        toAndList.To.GetType().Name,
                                        to.GetType().Name));
            }

            // 如果还没有路径则添加新的路径
            if (toAndList.StateList.Length == 0)
            {
                toAndList.StateList = path;
            }
            // 如果已经存在路径则返回
            else if (warnOverride)
            {
                Debug.LogError("Try to override the path of a conditional connection.");
            }
        }
示例#2
0
        /// <summary>
        /// 迁移到终点状态。
        /// 如果存在中间状态,则经由中间状态到达终点状态。
        /// </summary>
        /// <param name="toAndList">目标状态机路径数据。</param>
        private void TransitToTarget(ToAndList toAndList)
        {
            currTarget = toAndList.To;
            currPath   = toAndList.StateList;

            if (currPath.Length > 0)
            {
                TransitTo(currPath[0]);
                indexOnPath = 0;
            }
            else
            {
                TransitTo(currTarget);
                indexOnPath = -1;
            }
        }
示例#3
0
        //--------------------------------------------------
        // Link with exit code and condition
        //--------------------------------------------------

        /// <summary>
        /// 用退出码和条件和路径连接两个状态,当起点状态按指定退出码退出并满足条件时按路径迁移到终点状态。
        /// </summary>
        /// <param name="from">起点状态。</param>
        /// <param name="to">终点状态。</param>
        /// <param name="exitCode">退出码。</param>
        /// <param name="condition">条件类的实例。</param>
        /// <param name="path">起点和终点状态之间的过渡路径。</param>
        protected void Link(FsmState from, FsmState to, int exitCode, ICondition condition, bool inverse,
                            params FsmState[] path)
        {
            Dictionary <int, Dictionary <ICondition, ToAndList> > connections;
            Dictionary <ICondition, ToAndList> subConnections;

            condition = GetCondition(condition, inverse);

            if (!graphExitConditionConnections.TryGetValue(from, out connections))
            {
                connections    = new Dictionary <int, Dictionary <ICondition, ToAndList> >();
                subConnections = new Dictionary <ICondition, ToAndList>();
                subConnections.Add(condition, new ToAndList(to, path));
                connections.Add(exitCode, subConnections);
                graphExitConditionConnections.Add(from, connections);
                return;
            }

            if (!connections.TryGetValue(exitCode, out subConnections))
            {
                subConnections = new Dictionary <ICondition, ToAndList>();
                subConnections.Add(condition, new ToAndList(to, path));
                connections.Add(exitCode, subConnections);
                return;
            }

            ToAndList toAndList;

            if (!subConnections.TryGetValue(condition, out toAndList))
            {
                toAndList = new ToAndList(to, path);
                subConnections.Add(condition, toAndList);
                return;
            }

            throw new Exception(string.Format(
                                    "Try to override exist exit+condition connection:" +
                                    "\n{0} --> {2} : {1}\n{0} --> {3} : exit({4}) + {1}\n",
                                    from.GetType().Name,
                                    condition.GetType().Name,
                                    toAndList.To.GetType().Name,
                                    to.GetType().Name,
                                    exitCode));
        }