【Unity】PlayMakerの基本的な使い方
ゲームやキャラクターの状態を可視化し、 各状態にアクションを追加してゲームを制作できるアセット。
ノンコーディングというより、 カスタムアクションのスクリプトを作成することで状態遷移図で管理できるようになり、 全体の流れを目で確認できます。
基本的な流れ
- HierarchyのGameObjectを選択
- PlayMaker > PlayMakerEditorを開き、編集
- Add FSMでPlayMakerFSMコンポーネントを追加
- 状態(State)を選択し、Action BrowserからActionを選択
- Add StateでStateを追加
- StateとStateをTransitionでつなぐ
例えば、1秒待ったあとにStateを遷移し、Logを出す場合
アクション
カスタムアクション
はじめから用意されているアクションだけでは足りないためカスタムアクションを追加します。 FsmStateActionを継承したクラスを作成します。
using HutongGames.PlayMaker; public class CustomAction : FsmStateAction{ //... }
主に以下のメソッドをoverrideします。
- OnEnter
- OnUpdate
- OnExit
フィールドをpublicにすることでStateのActionから変数の値を設定できます。
public string text;
一部の型はFsm
をつけることでPlayMakerFSM内で変数の取得や変更ができます。
public FsmString text;
カテゴリなどを設定する場合はclassの前に以下を追加します。
- [ActionCategory(“Category/Name”)]
- [Tooltip(“”)]
アクションの完了
以下でアクションが完了します。
Finish();
全てのアクションが完了するとFINISHED
のイベントが発行されます。
Fsm
PlayMakerFsmやFsmStateActionからアクセスできるクラス。 GameObjectの取得やイベントの発行、変数の取得/変更などを扱える。
GameObject取得
var go = Fsm.GameObject;
イベントの発行
Stateのすべてのアクションが終了するとFINISHED
のイベントになりますが、
カスタムイベントは以下のようにし、該当するTransitionがあれば遷移します。
Fsm.Event("EVENT NAME");
EventsタブのAdd Eventにイベント名を記述するとイベントを追加できます。
変数
PlayMakerのEditorで事前にVariablesタブのNew Variableから変数を追加します。
var fsmVariable = Fsm.Variables.GetFsmInt("VariableName"); //取得 var value = fsmVariable.Value; //変更 fsmVariable.Value = 123;
追加した変数はInspectorの項目にチェックを入れると Inspectorから変数の値を設定できる
特にテンプレート化した場合にStateは変えずに値だけ変えたい場合に有効
テンプレート機能
テンプレートを使うことで異なるPlayMakerFSMでも同じものを使用できます。
- GameObjectから切り離したい場合
- 状態遷移は同じだが、変数の変更で挙動を変えたい場合
- Runで実行する場合
複数のPlayMakerFSM
1つのGameObjectに1つのPlayMakerFSMだけでは管理しづらい場合。
Enable FSM
GameObjectにPlayMakerFSMを追加し、チェックを外してコンポーネントを非アクティブにしておき、 ActionのEnable FSMでアクティブを切り替えます。
Run/Finish FSM
テンプレートのFSMを用意し、ActionのRun FSMで指定します。 終了はテンプレート側にActionのFinish FSMを追加します。
階層化
厳密には階層化ではありませんが、PrefabをInstantiateすることでそれらしいものを実現できます。
EmptyのGameObjectを作成し、PlayMakerFSMを追加。 あとは特定のStateのアクションからPrefabをInstantiate。 ただし、階層化のPlayMakerFSMの完了を取りたい場合は、 別途カスタムアクション等でイベントをとれるようにする必要があります。
グローバル変数
var g = HutongGames.PlayMaker.FsmVariables.GlobalVariables;
あとはローカル変数と同様に扱える
var gFsmFloat = g.GetFsmFloat("key"); gFsmFloat.Value;
その他
API Reference
Arbor
似たようなアセットにArborがあります。 Unite2017の講演によると、「ららマジ」でArborが使われているようです。