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