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

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 コンポーネント(またはそのバリアント:SimpleActorTriggerActor)を追加。
  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パーティのモンスター数をチェック

各分岐ノードには TrueFalse の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 がクラッシュすると失われる可能性があります。