public static void GenerateStateMachine(string path, string contextName, sStateInfo[] states)
        {
            if (!string.IsNullOrEmpty(path))
            {
                if (path[path.Length - 1] != System.IO.Path.PathSeparator)
                {
                    path += System.IO.Path.DirectorySeparatorChar;
                }

                List<string> stateNames = new List<string>();
                List<sStateInfo> validStates = new List<sStateInfo>(states);

                List<int> invalidStateIndices = new List<int>();

                for (int i = 0; i < states.Length; ++i)
                {
                    if (!string.IsNullOrEmpty(states[i].Name) && !stateNames.Contains(states[i].Name))
                    {
                        stateNames.Add(states[i].Name);
                    }
                    else
                    {
                        invalidStateIndices.Add(i);
                    }
                }

                if (invalidStateIndices.Count > 0)
                {
                    for (int invalidIndex = 0; invalidIndex < invalidStateIndices.Count; invalidIndex++)
                    {
                        validStates.Remove(states[invalidIndex]);
                    }
                }

                List<string> transitionNames = new List<string>();

                for (int validIndex = 0; validIndex < validStates.Count; ++validIndex)
                {
                    for (int transitionIndex = 0; transitionIndex < validStates[validIndex].ValidTransitions.Length; ++transitionIndex)
                    {
                        if (!string.IsNullOrEmpty(validStates[validIndex].ValidTransitions[transitionIndex].TransitionName) && !transitionNames.Contains(validStates[validIndex].ValidTransitions[transitionIndex].TransitionName))
                        {
                            transitionNames.Add(validStates[validIndex].ValidTransitions[transitionIndex].TransitionName);
                        }
                    }
                }

                string ns = string.Format("{0}.{1}", CodifyString(PlayerSettings.companyName), CodifyString(PlayerSettings.productName));

                ContextGenerator contextGenerator = new ContextGenerator();

                contextGenerator.Session = new Dictionary<string, object>();

                contextGenerator.Session["m_Namespace"] = ns;
                contextGenerator.Session["m_ClassName"] = contextName;
                contextGenerator.Session["m_StateNames"] = stateNames.ToArray();
                contextGenerator.Session["m_StartingStateIndex"] = 0;
                contextGenerator.Session["m_TransitionTypes"] = transitionNames;

                contextGenerator.Initialize();

                string test = contextGenerator.TransformText();

                if (!System.IO.Directory.Exists(path))
                {
                    System.IO.Directory.CreateDirectory(path);
                }

                System.IO.File.WriteAllText(path + contextName + FILE_EXTENSION, test);

                AssetDatabase.Refresh();
            }
        }
            public static sStateInfo Load(Dictionary<string, object> data)
            {
                sStateInfo info = new sStateInfo();

                if (data != null)
                {
                    if (data.ContainsKey("Name"))
                    {
                        info.Name = data["Name"] as string;
                    }

                    if (data.ContainsKey("ValidTypes"))
                    {
                        List<object> validTransitions = data["ValidTypes"] as List<object>;

                        if (validTransitions != null)
                        {
                            info.ValidTransitions = new sTransitionInfo[validTransitions.Count];

                            for (int i = 0; i < validTransitions.Count; ++i)
                            {
                                info.ValidTransitions[i] = sTransitionInfo.Load(validTransitions[i]);
                            }
                        }
                    }
                }

                return info;
            }