はじめに
PlaymakerのFSM同士で変数やイベントのやりとりはよく使う手法かと思います。
受け側のFSMの変数をイベントトリガーにして、監視側から何かブロードキャストしたときのメモです。
監視コストってCPU負荷高いよなーとかおもっていたけど、個人の小規模アプリにあまり関係なかったです。
手順
Playmakerで他のFSMから変数を常時監視し、特定の値に変わったときにイベントを発火させるには、Get FSM Variableアクションを使用しつつ、フレームごとに変数をチェックする設定を組み合わせることで実現できます。Get FSM VariableはGet FSM IntやGet FSM ****のアクションです。
1. Every Frame オプションを使う
Get FSM Variable アクションには、Every Frame というオプションがあります。これを使うことで、他のFSMの変数をフレームごとに継続的に監視することができます。値が変わった際に、それを検知してイベントを発火させ、処理を実行することが可能です。
2. Float Compare または Int Compare アクションで比較
取得した変数を監視する際に、値の変化を検知するためには、Float Compare や Int Compare のようなアクションを使用します。これらのアクションで比較を行い、特定の値に達したらイベントを発火するよう設定します。
1. Get FSM Variable アクションで監視対象の変数を取得
- Get FSM Variable アクションを追加します。
- Target FSM で監視したいFSMが存在するオブジェクトを指定します(例えば
Owner)。 - FSM Name で監視したいFSMの名前を指定します。
- Variable Name で取得したい変数名を指定します。
- Store Result で、その変数の値を保存するローカル変数を指定します(例えば、
monitoredValueなど)。 - Every Frame オプションにチェックを入れます。これにより、常に変数を監視し続けます。
2. Float Compare / Int Compare で値を比較
- Float Compare または Int Compare アクションを追加します。
- 先ほどの
monitoredValueを Float 1 または Int 1 に設定します。 - Float 2 や Int 2 に、監視したい目標値(例:10など)を指定します。
- 比較結果に応じて発火するイベントを設定します(例えば
Value ReachedやBelow Valueなど)。 - Every Frame オプションにチェックを入れ、これもフレームごとに監視できるようにします。
3. イベントを処理
Float Compare または Int Compare が条件を満たした際に発火するイベントを、別の状態(State)に遷移させ、そこで必要な処理を実行します。
例: 敵のHPを監視して、0になったらイベントを発火させる
- FSM1(敵のHP管理FSM) で
healthという変数を管理しているとします。 - FSM2(監視用FSM) で、
Get FSM Variableを使ってFSM1のhealth変数を取得します。 Float Compareで、healthが0に達したかどうかを監視し、0になったらEnemyDeadというイベントを発火させます。- 発火した
EnemyDeadイベントに応じて、次のアクション(例えば、敵を倒す処理やエフェクトの再生など)を実行します。
おわりに
- 監視する頻度は
Every Frameオプションを使用することでフレームごとに実行されるため、リアルタイムで値の変化を反映できますが、パフォーマンスが気になる場合は一定間隔で監視することも考えられます。 - 状況によっては
Waitアクションを使って一定間隔ごとにGet FSM Variableを実行させることで、少し負荷を軽減しながら監視を行うことが可能です。
この方法で、常時他のFSMの変数を監視し、特定の条件で処理を実行するシステムを構築できます。
Every Frameの動作はそのステートのEvery Frameのアクションから別のステートに遷移した時とFINISHEDトランジションで止まります。

監視側のFSMの例。

