今回はタイトル画面でスタートボタンが押された時の処理を解説していきます。

○ StartButton
NGUIのUIButtonコンポーネントを持つボタンのGUI部品です。
NGUIのイベントをFSMに通知するためにPlayMakerの開発元から提供されているNGUIアドインをセットしてあります。
スタートボタンを押すと初回はプロローグ画面へ、その後はゲーム画面へ遷移するようになっています。



1. Init
シーンが読込まれPlayMakerFSMが動き出した時に初めに到達する状態(ステート)です。
前回紹介したTitleControllerのInitとはほぼ同時(順不同)で動作します。
UnityのスクリプトにおけるAwake()の実行順と同じとイメージすれば良いでしょう。
ただしPlayMakerの場合は実行順を制御する機構がないようですので、FSM同士の関連には注意が必要です。
(※:未確認ですがUnityのスクリプトの実行順制御によりPlayMakerFSMの実行順も制御できるかもしれません。PlayMakerFSM自体も一種のコンポーネントですので。)

1-1. Stop Activity Indicator(カスタム)
処理中を示すインジケーター(くるくる回転するアイコン)を停止・非表示にします。
2. Idle
何も行いません。
ボタンが押下された時に「NGUI / ON CLICK」イベントが来るのを待ち受けます。

3. OnClick
Idleの状態からボタンが押下された時に遷移する状態です。

3-1. Stop BGM(カスタム)
再生中のBGMを停止します。
3-2. Play Start Button SE(カスタム)
スタートボタン押下の効果音を再生します。
4. CheckPrologue
スタートボタン押下後に到達するステートです。
初回起動かどうかを判断して、プロローグかゲーム画面に遷移を振り分けます。
上記のOnClick中に書いても良い処理ですが、分かり易さのために分けてあります。

4-1. PlayerPrefs Get Int(PlayerPrefs)
PlayerPrefに保存されている物語の進行度を表す数値を取り出し、変数storyにセットします。
Unity標準のPlayerPrefs.GetInt()と同様のアクションですが、複数の値を同時に扱えるのが少し便利です。
4-2. Int Compare(Logic)
さきほど取り出したstoryの値が1以上なら「START_GAME」イベントを発生しゲーム画面へ遷移する処理へ、1未満なら「FINISHED」イベントを発生しプロローグへ遷移する処理へ移ります。
5. StartPrologue
初めてスタートボタンを押した時に到達するステートです。

5-1. Activate Game Object(GameObject)
インスペクタ上で指定したフェードアウト用のNGUIスプライトを有効にします。
Unity標準のGameObject.SetActive()と同様のアクションです。
5-2. Wait(Time)
1.1秒間待機した後に指定のイベント(今回は指定してないのでFINISHEDイベント)を発生します。
このように待機した後に処理を行いたい場合は、別の状態を用意してイベントにより遷移させる必要があります。
このアクションが途中に挟まれていたとしても、以降のアクションも全て実行される点に注意が必要です。
6. LoadLevelPrologue
プロローグ画面へ遷移します。

6-1. Move Off Ad Banner(カスタム)
広告バナーを画面外に隠します。
6-2. Load Level(Level)
「Prologue」という名前のシーンをロードします。
UnityのApplication.LoadLevel()にあたるアクションですが、Additive/Asyncなどがオプションとして選択できるようになっています。
7. StartGame
すでにゲームをやったことがある場合にスタートボタンを押すと到達するステートです。
内容は前述の「5. StartPrologue」とほぼ同様なので説明は省略します。

8. LoadLevelGame
ゲーム画面へ遷移します。
さきほどのプロローグ画面への遷移と違いロード中画面を挟んだ遷移なので、アクションの内容が異なっています。

6-1. Play Game BGM(カスタム)
ゲーム画面用のBGMの再生を開始します。
6-2. Load Lovel Transition(カスタム)
ロード中画面を表示した上で「Stage01」という名前のシーンをロードします。
ーーーーー
今回の中では「2. Idle」の何もアクションの無い状態が特徴的だったと思います。
こういう状態を用意することで、外部からの操作でイベントを飛ばしてもらって処理を行うというような記述が可能になります。
また、プロローグの場合とゲーム画面の場合でフェードアウトの処理を変えていたり、BGMを止めたり、ロード中画面を挟んだりなど微妙な調整を色々としています。
これがどのような違いを生むかは、もうじきリリース予定の「あ〜ちゃ〜の大冒険」でぜひ確認してみて欲しいと思います。