Ejemplo n.º 1
0
        /// <summary>
        /// ステートマシーンを作成します。
        /// 初期ステートを指定する場合はInitStateAttribute属性を使用してください。
        /// </summary>
        public static StateMachine Create(object owner, object prm = null)
        {
            //初期化
            if (s_StateInfos == null)
            {
                Init();
            }

            StateMachine stateMachine = new StateMachine(owner);
            State        init         = null;

            //ステートと遷移条件を登録
            foreach (var info in s_StateInfos)
            {
                var state = info.GetState();
                stateMachine.AddState(state);
                bool useInit = info.UseInit;
                foreach (var transiton in info.DirectTransitions)
                {
                    stateMachine.AddDirectTransition(transiton.EventId, state, transiton.ReTranstion);
                    useInit |= transiton.UseInit;
                }
                foreach (var transiton in info.Transitions)
                {
                    var to = s_StateInfos.First((x) => x.Type == transiton.ToState).GetState();
                    stateMachine.AddTransition(transiton.EventId, state, to);
                    useInit |= transiton.UseInit;
                }
                if (useInit)
                {
                    init = state;
                }
            }
            //キャッシュを破棄
            foreach (var info in s_StateInfos)
            {
                info.ClearState();
            }
            //初期化
            if (init != null)
            {
                stateMachine.Init(init, prm);
            }
            else
            {
                stateMachine.Init(prm);
            }
            return(stateMachine);
        }