【Unity】PlayMakerの基本的な使い方

ゲームやキャラクターの状態を可視化し、 各状態にアクションを追加してゲームを制作できるアセット。

ノンコーディングというより、 カスタムアクションのスクリプトを作成することで状態遷移図で管理できるようになり、 全体の流れを目で確認できます。

Playmaker - アセットストア

基本的な流れ

  • HierarchyのGameObjectを選択
  • PlayMaker > PlayMakerEditorを開き、編集
    1. Add FSMでPlayMakerFSMコンポーネントを追加
    2. 状態(State)を選択し、Action BrowserからActionを選択
    3. Add StateでStateを追加
    4. StateとStateをTransitionでつなぐ

例えば、1秒待ったあとにStateを遷移し、Logを出す場合

f:id:chocolattips:20170708133329g:plain

アクション

カスタムアクション

はじめから用意されているアクションだけでは足りないためカスタムアクションを追加します。 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

API Reference

Arbor

似たようなアセットにArborがあります。 Unite2017の講演によると、「ららマジ」でArborが使われているようです。

Unityで出来る『見える開発』のススメ ~スマホゲーム「ららマジ」開発事例~

参考