/// <summary> /// load state from file. /// </summary> /// <param name="asset"> /// the state machine file. /// </param> /// <returns></returns> private bool LoadFromFile(TextAsset asset) { SMContext context = JsonConvert.DeserializeObject <SMContext>(asset.text); //!解析状态值 for (int i = 0; i < context.states.Count; i++) { try { SMState state = Activator.CreateInstance(Type.GetType(context.states[i]), new object[] { context.states[i], gameObject }) as SMState; _statesByName.Add(context.states[i], state); _statesByHash.Add(state.HashCode, state); } catch { Debug.Log("can't create state named " + context.states[i]); continue; } } Default = GetState(context.default_state); _activeState = Default; //!解析默认参数值 foreach (string param in context.default_params) { ParseParamData(param); } //!解析transtitions for (int i = 0; i < context.transitions.Count; i++) { TranContext tranContext = context.transitions[i]; SMState origin = GetState(tranContext.origin); if (origin == null) { Debug.Log(string.Format("can't make transition from {0} to {1}", tranContext.origin, tranContext.dest)); continue; } SMTransition transition = origin.MakeTransition(tranContext.dest, tranContext.duration); if (transition == null) { Debug.Log(string.Format("can't make transition from {0} to {1}", tranContext.origin, tranContext.dest)); continue; } for (int j = 0; j < context.transitions[i].conditions.Count; j++) { string fileName = tranContext.conditions[j].fileName; List <string> args = tranContext.conditions[j].paramDatas; try { SMCondition condition = Activator.CreateInstance(Type.GetType(fileName), new object[] { args, gameObject }) as SMCondition; transition.AddCondition(condition); } catch { Debug.Log(string.Format("can't make transition from {0} to {1}, condition {2} not found!", tranContext.origin, tranContext.dest, tranContext.conditions[j])); origin.RemoveTransition(transition); } } } return(true); }
public void AddCondition(SMCondition condition) { _conditions.Add(condition); }