メインコンテンツまでスキップ

高度なロジックパターン

単純な接続の枠を超え、この章ではフローシステムの**実行時のアーキテクチャ(Runtime Architecture)**について深く掘り下げます。

トリガー(Trigger)とチェーン(Chain)がどのように実行されるのか、そしてノードの設定がイベントの設定とどのように相互作用するのかを理解することが、複雑なゲームロジックをマスターするための鍵となります。


⚙️ コア・メカニクス:トリガー vs. チェーン

フローグラフにおける接続は、単なる「線」ではありません。それは**「制御の移譲(Transfer of Control)」**です。*ターゲットノード(接続先)*のタイプによって、その制御がどのように扱われるかが決まります。

機能🟠 トリガーノード (Trigger)🟢 チェーンノード (Chain)
実行モード並列 (ファンアウト)直列 (シーケンス)
ブロッキング?非ブロッキングブロッキング(後続を待機させる)
技術的実装Fire-and-Forget(投げっぱなし)Coroutine Yield(コルーチンによる待機)
データフローすべての子ノードに即座にデータを渡す。処理完了後、次の子ノードにのみデータを渡す。

1. トリガーの仕組み(並列実行)

フローがトリガーノードに入ると:

  1. システムは接続されているすべてのトリガーの**優先度(Priority)**を計算します。
  2. ループ処理によって、優先度の高い順に一つずつ実行していきます。
  3. 重要な点として、システムは一つのトリガーがタスクを完了するのを待たずに、次のトリガーを開始します。
  4. 結果: プレイヤーからは、すべてのエフェクト(音、UI、パーティクル)が同じフレーム内で同時に発生しているように見えます。

2. チェーンの仕組み(直列実行)

チェーンノードは、演出のテンポを制御するために設計された複雑なライフサイクルを持っています。**「二層の遅延(Two Layers of Delay)」**を使用してフローを保持します。

  1. 実行前: Start Delay(開始遅延)の間待機します。
  2. 実行: イベントを発行します。
  3. 実行後: Duration(継続時間)または Wait For Completion(完了待機)の間待機します。
  4. シグナル: これらすべてが終了して初めて、次のノード(Next Node)を起動します。

⏱️ 実行のタイムライン

**ノード設定(グラフ層)イベント設定(インスペクター層)**がどのように相互作用するかを理解することは極めて重要です。

「ダブルディレイ(二重遅延)」のルール

ノードに遅延を設定し、さらにイベントにも遅延を設定した場合、それらは合算されます。

アクションまでの合計時間 = ノードの開始遅延 + イベントのアクション遅延

ビジュアル・タイムライン

単一のチェーンノードが実行される際の、ミリ秒単位の分解図です:

[フローがノードに進入]

├── 1. ノード条件チェック (グラフ層)
│ 🛑 False の場合: 停止

├── 2. ノードの開始遅延 (グラフ層) ⏱️
│ ⏳ 待機中...

├── 3. イベントの発行 (コア層) 🚀
│ │
│ ├── a. イベント条件チェック (インスペクター層)
│ │ 🛑 False の場合: アクションをスキップ(ただしフロー自体は継続!)
│ │
│ ├── b. イベントのアクション遅延 (インスペクター層) ⏱️
│ │ ⏳ 待機中...
│ │
│ └── c. UnityActions の起動 (ゲームロジック) 🎬
│ (例: アニメーション再生、HPの減算など)

├── 4. ノードの継続時間 / 完了待機 (グラフ層) ⏳
│ 🛑 ここでフローがブロック(停止)されます。
│ (設定された秒数、または非同期処理の完了を待機)

└── 5. 次のノードへのシグナル送信 ⏭️
アーキテクチャ上の注意点
  • イベント条件は、その場の*ローカルな副作用(手順 c)*のみを停止させます。フローグラフが手順 4 および 5 へ進むのを止めることはありません
  • フローグラフのロジック自体を停止させたい場合は、必ずノード条件(手順 1)を使用してください。

🛠️ クックブック:実践的なデザインパターン

ゲーム開発でよく遭遇する問題を解決するための、標準的な設計パターンです。

1. 「シネマティック」パターン(カットシーン)

目標: 厳密にタイミング制御された一連のイベント。 シナリオ: カメラが移動 ➔ ドアが開く ➔ キャラクターが入ってくる ➔ ダイアログが開始。

alt text

  • 構造: Root ➔ Chain ➔ Chain ➔ Chain
  • 設定:
    • すべてのステップに**チェーンノード (🟢)**を使用します。
    • **ノードの継続時間 (⏳)**を使用してシーケンスのテンポを制御します。
      • : 「ドアを開くアニメーション」に2.0秒かかる場合、ノードの継続時間を2.0に設定することで、キャラクターが閉まったドアを通り抜けてしまうのを防ぎます。

2. 「ブロードキャスター」パターン(プレイヤーの死亡)

目標: 一つの状態変化が、複数の独立したシステムをトリガーする。 シナリオ: プレイヤーが死亡。SEの再生、ゲームオーバーUIの表示、ラグドールの生成、ゲームの保存を同時に行いたい。

alt text

  • 構造: Root ➔ 複数のトリガー
  • 設定:
    • Root: OnPlayerDeath
    • 子ノード: 4つの独立したトリガーノード (🟠)
    • 理由: もし「ゲームの保存」システムがフリーズしたりエラーを起こしたりしても、それが「ゲームオーバーUI」の表示を妨げてはいけません。並列実行は安全性を確保します。

3. 「ハイブリッド・ボス」パターン(複雑な状態遷移)

目標: 複雑なAIのフェーズ移行。 シナリオ: ボスが第2フェーズに突入。ボスが咆哮(アニメーション)し、同時に音楽が変化してアリーナが赤く染まる。咆哮が終わった瞬間に、ボスが攻撃を開始する。

alt text

  • 構造:
    1. Root (OnHealthThreshold)
    2. チェーンノード (BossRoarAnim):「完了待機(Wait For Completion)」にチェックを入れる(または Duration をアニメーションの長さに設定)。
    3. トリガーノード (MusicChange):Root に接続(咆哮と並列)。
    4. トリガーノード (ArenaColorChange):Root に接続(咆哮と並列)。
    5. チェーンノード (StartAttack):BossRoarAnim ノードに接続。
  • フロー:
    • 音楽の変化と色の変化は、咆哮と同時に即座に発生します。
    • StartAttack は、咆哮のチェーンノードが完全に終了するまで待機します(タイムラインの手順 4)。

🎯 まとめ:どの場合に何を使うか?

要件使用するノードタイプ理由
「Xをした後、Yをする」チェーン (🟢)ブロッキングにより順序を保証します。
「X, Y, Zをすべて同時にする」トリガー (🟠)投げっぱなし。並列実行されます。
「もし HP < 0 なら、Xをする」ノード条件フローロジック自体を完全に停止させます。
「ミュート中でない時のみ音を鳴らす」イベント条件フローロジックは継続させつつ、副作用のみを停止します。
「Xをする前に待機する」ノードの開始遅延イベントの発行を遅らせます。
「Xをした後、Yをする前に待機する」ノードの継続時間(チェーンのみ) 次のノードへの信号を遅らせます。