Playmaker テンプレートとは
Playmakerにはテンプレートというものがあり、簡単に言えば使いまわせるFSMを作れる。
要は独自のフローをまとめて、1つのアクション、関数みたいなものが作れます。
テンプレートの実装例
簡単な足し算テンプレートを例に作ってみます。【 A + B = C 】

【GameObject側のFSM】RunFSMアクションを使いたいステートに入れる。Newを押下してテンプレートを作成する。
※テンプレートの作成方法は他にもありますが、今はこの方法で。

【GameObject側のFSM】好きな名前でプロジェクトにFSMテンプレートを作成します。Editボタンを押下すると作成したFSMテンプレートを編集できます。

【Template側のFSM】見た目はいつものFSMと何もかわりません。

【Template側のFSM】今回簡単な足し算を行うので、【 A + B 】の部分、引数を2つ(inputA, inputB)、計算結果をストアする変数を1つ(result 【 C 】の部分)を作成します。ローカル変数なので他のFSM同様このFSM内で利用する変数となります。

【Template側のFSM】引数(inputA,inputB)にInputのチェックを入れてあげます。

【Template側のFSM】計算した結果をストアする変数(result)にOutputのチェックを入れてあげます。

【Template側のFSM】inputA + inputB = result (【 A + B = C 】)にするので、int Operatorアクションをつかって先ほどinputA + inputB変数で計算した結果をresult に渡すようにしました。

【Template側のFSM】処理が完了したら最後にFinish FSMを配置します。これで入力された2つの変数の足し算のテンプレートを作成は完了です。

【GameObject側のFSM】元のFSMに戻ります。先ほど編集したテンプレートのInputチェックを入れた変数(inputA, inputB)が入力として表示されるようになります。またOutputチェックを入れた変数(result)が値を渡す出力として表示されるようになりました。

【GameObject側のFSM】実行元のFSMで、作成したテンプレートが計算した結果を入れる変数を作っておきます。※変数の名前はなんでもいいです。

【GameObject側のFSM】これでテンプレートのresultの変数の値を、このFSMの変数に渡す準備が整いました。

【GameObject側のFSM】1 + 2 = 3となるよう、inputA,inputBに数値を入力してkotae変数に3が入れば成功です。

【GameObject側のFSM】実行。kotaeには3が出力されていますね。

【Template側のFSM】テンプレート側も見てみましょう。inputA,inputBに値が渡され、足した結果がresultに出力されました。
便利ですね!
実装例
足し算テンプレート作ったところで、ということで、実際自分のアプリに組み込んでいるテンプレートの一部です。
例:enumの複数の値をORで比較するアクションテンプレートを作成した。

こんな感じにEnumのOR比較をおこなえるようにした。

テンプレート側のフロー。Enumのリスト分回してマッチしたらtrueを返すようにする。
注意点
RunFSMを使う上で、編集しなおしたりすることが多々あると思います。その時に内容が反映されないことがあり、その場合は一度RunFSMを選択しなおすことで反映されます。
テンプレートからさらにテンプレートを呼び出し、その戻り値を取得しようすると、正しく機能ない場合があります。
例:①テンプレート→②Array For EachのRunFSMでテンプレートを作成→③②戻り値を①で取得しようとすると取得できない。どうもoutput変数の既定値がそのまま反映されている。バグか実行タイミングで取得が前後するのか?※Array For Eachが実験的な実装だそうで、Array Get Next使った方が確実に動くし可視性も良いです。
最後にテンプレートからテンプレートを呼んでさらにテンプレート……とやると、可視性が悪くなるので、そこまでやる必要がある複雑な処理はカスタムアクションに落とし込んだ方が良いかと思います。
また作成したテンプレートが他のプロジェクトにもっていけないのが不便ですね。
おわりに
このように何度も再利用できる独自のカスタムアクションを作ることができます。C#が書けなくてもかなり複雑な処理を構築することが可能です。
何度も同じ処理を作らなくて済むのは便利ですね。
私も分岐して同じ処理を繰り返すような実装ではテンプレートをよく使っています。







