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