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

CommandGraph:ノードベースのイベントスクリプティング

CommandGraph は MCE のビジュアルスクリプティングシステムで、NPC の動作、カットシーン、クエスト、インタラクティブイベントを作成するためのものです。コマンドを接続してイベントシーケンスを定義するノードベースのエディタを提供します -- C# コードは不要です。

これは DLL ティアを含む、ソースコードにアクセスできないすべてのティアのゲームデザイナーにとって主要なツールです。

CommandGraph とは?​

CommandGraph は Actor(ワールド内の任意のインタラクト可能なエンティティ)に紐付けられたノードグラフです。プレイヤーがアクター(インタラクト、踏む、またはエリアに進入)をトリガーすると、グラフがノードを順次実行します。

ビジュアルスクリプトとして考えてください。各ノードがゲームアクションです:

[Start] → [Show Dialog] → [Branch: Has Badge?]
├─ Yes → [Give Item] → [End]
└─ No → [Show Dialog: "Come back later"] → [End]

最初のイベントの作成​

ステップ 1:アクターの作成​

  1. シーン内のNPCを配置したい場所に空の GameObject を作成。
  2. Actor コンポーネント(またはそのバリアント:SimpleActor、TriggerActor)を追加。
  3. NPC のビジュアル用に SpriteRenderer を追加。
  4. アクターは自動的に GridController に登録されます。

ステップ 2:CommandGraph エディタを開く​

  1. Actor の GameObject を選択。
  2. Inspector で CommandGraph セクションを見つけます。
  3. Edit Graph をクリックしてノードエディタウィンドウを開きます。

ステップ 3:ノードの追加​

  1. グラフエディタ内で右クリックして Add Node メニューを開きます。
  2. ノードはカテゴリ別に整理されています(下記参照)。
  3. ノードタイプを選択してグラフに追加。
  4. ノードの出力ポートから別のノードの入力ポートにドラッグして接続。

ステップ 4:ノードの設定​

ノードをクリックすると Inspector パネルにプロパティが表示されます:

  • ダイアログノード:表示するテキスト、話者名、ポートレートを入力。
  • 分岐ノード:チェックするゲーム変数と比較方法を選択。
  • アイテムノード:付与/除去するアイテムと数量を選択。
  • ワープノード:ターゲットシーンと位置を設定。

アクタータイプ​

MCE は複数のアクターバリアントを提供します:

アクタータイプトリガー用途
Actorプレイヤーがインタラクト(向かい合ってアクションボタンを押す)NPC、看板、オブジェクト
SimpleActorプレイヤーがインタラクト、簡略化セットアップ基本的なNPC
TriggerActorプレイヤーが踏むまたはエリアに進入自動トリガー、隠しイベント
GridSubscribingActorグリッドイベントに反応感圧板、近接
PushableActorプレイヤーが歩いて押す岩、パズルブロック
ActorItemプレイヤーがインタラクト、アイテムを付与して消滅地面のアイテム拾い

ノードカテゴリ​

ダイアログ​

テキストの表示、応答の選択、会話の管理。

ノード説明
ShowDialog話者のメッセージを含むテキストボックスを表示
ShowChoiceDialogプレイヤーに複数選択肢を提示
ShowMonsterDialogモンスターに関連するダイアログを表示(スプライト付き)
CharacterPopUpNPC の頭上にポップアップを表示(!、?、...)

ShowDialog の例:

Speaker: "Professor Elm"
Text: "Welcome to the world of monsters!"
Portrait: oak_portrait
Wait for Input: true

分岐​

条件に基づいてフローを制御。

ノード説明
BranchOnVariableGameVariable をチェックして Yes/No に分岐
BranchOnBadgeプレイヤーが特定のバッジを持っているかチェック
BranchOnItemプレイヤーが特定のアイテムを持っているかチェック
BranchOnMonsterプレイヤーのパーティに特定の種族がいるかチェック
BranchOnMoneyプレイヤーが十分なお金を持っているかチェック
BranchOnRosterCountパーティのモンスター数をチェック

各分岐ノードには True と False の2つの出力ポートがあります。

アイテム​

プレイヤーのインベントリを管理。

ノード説明
GiveItemプレイヤーのバッグにアイテムを追加
TakeItemプレイヤーのバッグからアイテムを削除
GiveMonsterプレイヤーのパーティにモンスターを追加
GiveMoneyプレイヤーの財布にお金を追加
TakeMoneyプレイヤーの財布からお金を削除

モンスター​

プレイヤーのモンスターとのインタラクション。

ノード説明
HealPartyパーティの全モンスターを完全回復
SelectMonsterプレイヤーがモンスターを選ぶためのパーティ画面を開く
TeachMoveモンスターに特定の技を教える
EvolutionCheckパーティ全員の進化チェックをトリガー
SetNicknameプレイヤーがモンスターの名前を変更できるようにする

バトル​

バトルのトリガーと設定。

ノード説明
StartTrainerBattle設定済みのチームとトレーナーバトルを開始
StartWildBattle特定のモンスターと野生エンカウントを開始
BranchOnBattleResultプレイヤーが前回のバトルに勝利したかチェック

変数​

ゲーム状態の読み書き。

ノード説明
SetVariableGameVariable に値を設定
AddToVariable数値の GameVariable に加算
CheckVariableGameVariable の値をロジック用に読み取り

GameVariable はグローバル状態システムです。セーブデータに永続化され、任意の CommandGraph やスクリプトからチェックできます。

サウンド​

オーディオ再生の制御。

ノード説明
PlayBGMBGMを変更
PlaySE効果音を再生
StopBGM現在の音楽を停止
FadeOutBGM指定時間で音楽をフェードアウト

アニメーション​

キャラクターとカメラのアニメーション。

ノード説明
MoveActorNPCを目標位置に移動
TurnActorNPCを特定の方向に向ける
WaitSecondsグラフを指定時間一時停止
FadeScreen画面を黒くフェードまたは戻す
ShakeScreenカメラを揺らす

ワープ​

プレイヤーを場所間で移動。

ノード説明
TeleportPlayerプレイヤーを現在のシーン内の特定タイルに移動
WarpToSceneプレイヤーを別のシーンに遷移

クエスト(Pro ティア以上)​

クエストの進行管理。

ノード説明
StartQuestクエストを開始
CompleteObjectiveクエスト目標を完了としてマーク
FailQuestクエストを失敗にする
BranchOnQuestStateクエストの現在の状態をチェック
GiveQuestRewardクエストの報酬を付与

ショップ​

ショップインターフェースを開く。

ノード説明
OpenShop設定済みアイテムリストで売買ショップUIを開く

セーブ​

セーブデータの管理。

ノード説明
SaveGame現在のスロットへのセーブをトリガー

ユーティリティ​

その他のユーティリティノード。

ノード説明
DeactivateActorアクターを非表示にする(アイテム拾い後など)
EnablePlayerプレイヤーの移動を有効/無効にする

ノードの接続​

CommandGraph はフローベースの接続モデルを使用します:

  • 各ノードには入力ポート(左側)と1つ以上の出力ポート(右側)があります。
  • 出力ポートを別のノードの入力ポートに接続して実行順序を定義します。
  • 分岐ノードにはラベル付きの出力ポートがあります(True/False、Choice1/Choice2 など)。
  • 接続されていない出力ポートを持つノードはグラフの実行を終了します。

例:ショップNPC​

[Start]
→ [ShowDialog: "いらっしゃいませ!何かお探しですか?"]
→ [ShowChoiceDialog: "買う" / "売る" / "いいえ"]
├─ Choice 1 ("買う") → [OpenShop: item_list_potions]
├─ Choice 2 ("売る") → [OpenShop: sell_mode]
└─ Choice 3 ("いいえ") → [ShowDialog: "またのお越しをお待ちしております!"]

例:クエスト依頼者​

[Start]
→ [BranchOnVariable: "rescued_lost_monster" == true]
├─ True → [ShowDialog: "モンスターを見つけてくれてありがとう!"]
│ → [BranchOnVariable: "quest_reward_given" == true]
│ ├─ True → [ShowDialog: "わざマシンを使ってね!"]
│ └─ False → [GiveItem: TM_Thunderbolt, 1]
│ → [SetVariable: "quest_reward_given" = true]
│ → [ShowDialog: "お礼にこれを受け取ってください!"]
└─ False → [ShowDialog: "迷子のモンスターを探してほしいのです!"]
→ [ShowDialog: "北の洞窟に逃げ込んだようです。"]
→ [SetVariable: "quest_find_monster" = true]

例:ジムリーダー​

[Start]
→ [BranchOnBadge: "BoulderBadge"]
├─ HasBadge → [ShowDialog: "もうすでに実力を証明しましたね!"]
└─ NoBadge
→ [ShowDialog: "私がジムリーダーだ!バトルの準備をしろ!"]
→ [StartTrainerBattle: gym_leader_team]
→ [BranchOnBattleResult]
├─ Won → [ShowDialog: "見事だ!これを受け取れ。"]
│ → [GiveBadge: "BoulderBadge"]
│ → [GiveItem: TM_RockTomb, 1]
└─ Lost → [ShowDialog: "もっと鍛えて出直してこい!"]

イベントのテスト​

  1. エディタでプレイモードに入ります。
  2. キャラクターをアクターまで歩かせます。
  3. インタラクトボタン(デフォルト:Z またはゲームパッドの A)を押します。
  4. CommandGraph が実行され、フローを観察できます。
デバッグモード

グラフが期待通りに動作しない場合:

  1. Console でエラーを確認してください。
  2. 参照されている GameVariable、アイテム、モンスターが存在するか確認してください。
  3. すべての出力ポートが接続されていることを確認してください -- 未接続の分岐は静かにグラフを終了します。
  4. Debug ノード(利用可能な場合)を使用して実行中の変数状態をログ出力してください。

ベストプラクティス​

  1. アクターにはわかりやすい名前を付けましょう。「NPC_Professor_Lab」は「Actor (3)」より良いです。
  2. 状態には GameVariable を使用しましょう。アクターの有効/無効だけに頼らないでください。
  3. 両方の分岐をテストしましょう。すべての BranchOnVariable で True と False の両方のパスが動作することを確認してください。
  4. グラフを読みやすく保ちましょう。空間レイアウトを使ってフローを明確にしてください。関連するノードをまとめましょう。
  5. パターンを再利用しましょう。動作するショップNPCができたら、複製して他のショップ用に修正してください。
  6. テスト前にセーブしましょう。CommandGraph の変更はシーンレベルの変更であり、Unity がクラッシュすると失われる可能性があります。