/// <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."); } }
/// <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; } }
//-------------------------------------------------- // 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)); }