【実践記事・ADV編⑥】19本の会話データを流し込む——DialogueDataの実践的な作り方

初心者向け実践開発

対応バージョン:Unity 6.3 LTS(6000.3系)/WebGL出力 この記事はシリーズ全11回の第6回です。前回までで会話・フラグ・証拠・エンディングのすべてのシステムが動く状態になりました。今回は台本のセリフをUnityに入力していきます。 【PR】本記事にはアフィリエイトリンクを含みます。

システムが揃ったところで、いよいよゲームの中身——19本分の会話データをDialogueDataに入力していく作業に入ります。

「入力するだけなら単純作業では?」と思うかもしれませんが、実際にやってみると台本の段階では気づかなかった矛盾や問題がいくつも出てきました。今回はその体験をそのまま記事にします。

目次


作業の全体像

今回入力するDialogueDataの総数は19本です。章ごとに分けると以下の通りです。

Chapter1/(3本)
  Ch1_Opening          // ナレーション〜民宿
  Ch1_Lounge           // 月凪・初訪問
  Ch1_Morning          // 翌朝・松本との出会い

Chapter2/(14本)
  Ch2_Matsumoto_Action // 松本「昨夜の行動について」
  Ch2_Matsumoto_Kenta  // 松本「木下健太について」
  Ch2_Matsumoto_Police // 松本「警察には?」
  Ch2_Saya_Night       // 沙耶「あの夜のこと」
  Ch2_Saya_Tanaka      // 沙耶「田中警官との関係」
  Ch2_Saya_Leave       // 沙耶「島を出ようと思ったことは?」
  Ch2_Saya_Past        // 沙耶「月凪の過去について」
  Ch2_Tanaka_Return    // 田中「木下さんの帰宅について」
  Ch2_Tanaka_Lounge    // 田中「月凪との関係について」
  Ch2_Tanaka_North     // 田中「島の北側について」
  Ch2_Isobe_Lounge     // 磯部「月凪について」
  Ch2_Isobe_Tanaka     // 磯部「田中警官について」
  Ch2_Isobe_Ruins      // 磯部「廃旅館について」
  Ch2_Isobe_Road       // 磯部「廃旅館への道」

Chapter3/(2本)
  Ch3_Matsumoto_Video  // 松本・再会話(証拠動画入手)
  Ch3_Tanaka_Confront  // 田中追及・動画提示

Chapter4/(1本)
  Ch4_Tanaka_Confess   // 田中の自白

DialogueDataの入力手順

各DialogueDataの入力方法は共通しています。

🔧 詳しい手順

  1. Data/Dialogues/Chapter1(またはChapter2〜4)フォルダで右クリック→「MysteryADV」→「DialogueData」を選択し、ファイル名をつける(例:Ch1_Opening)
  2. Inspectorの「Scene Title」にシーン名を入力する(管理用なのでゲーム画面には表示されない)
  3. 「Lines」のSizeを会話の行数に合わせて設定する
  4. 各Elementに「Speaker Name」「Dialogue Text」「Is Monologue」を入力する
  5. 必要があれば「Set Flag On Complete」にフラグIDを入力する
  6. 証拠を入手させる会話の場合は「Grant Evidence On Complete」に証拠データをドラッグ&ドロップする

Is Monologueのルール

凛の内心(モノローグ)はIs Monologueをオンにします。DialogueManagerはisMonologueがtrueのとき、Speaker Nameを空にしてテキストを「(〜)」という括弧付きで表示します。

Is Monologue:オン  → 「(潮の匂い。錆びた手すり。)」
Is Monologue:オフ  → 「凛:旅行者です。一杯だけいいですか。」
Ch1_OpeningのDialogueDataにセリフを入力している状態のInspector

台本を入力していて気づいた矛盾3選

台本を書いていた段階では気づかなかった問題が、実際にUnityで入力しながら通しで読んでみると浮かび上がってきました。

つまずき1:松本が知っているはずのない情報を話していた

第2章の最初に松本と話すシーンで、以下のようなセリフを書いていました。

台本(修正前)

松本:「友達が月凪でぼったくられて、すごい額を請求されたんです。払えないって揉めてて……」

ここで問題に気づきました。松本は途中で気分が悪くなって先に宿に帰っています。友人の健太が月凪で揉めていた場面を松本は直接見ていないのです。なのに「すごい額を請求された」「揉めてた」という詳細をなぜ知っているのか、説明がありませんでした。

修正後

松本:「宿に戻る前に健太からLINEが来てて。『すごい額請求された、払えないって揉めてる』って。それが最後のメッセージで、それ以降既読もつかなくて。」

「LINEで教えてもらった」という情報の出所を追加することで、自然な流れになりました。台本を書いているときは流れを追うのに精一杯で、「この情報を誰がどうやって知ったか」という視点が抜けやすいことを実感しました。

つまずき2:月凪という名前が出る前に月凪と言っていた

第1章の民宿のシーンでは、宿のおかみが「港の近くのラウンジ」としか言っていません。月凪という名前を知るのは、凛が実際にそのラウンジを訪れてからのはずです。

ところが第1章の翌朝シーン(松本との出会い)で、当初こんなセリフを書いていました。

台本(修正前)

凛:「昨夜、月凪に行きました。あのお店のことは知っています。」

このセリフの直前では、松本はまだ「月凪」という名前を口にしていません。凛が「月凪」と言うのはおかしく、「月凪に行ったことを凛はどう知ったのか」という混乱を招きます。

修正後

凛:「昨夜、港のラウンジに行きました。あのお店のことは知っています。」

「月凪」を「港のラウンジ」に変えるだけで、どちらも同じお店を指していることが自然に伝わるようになりました。

つまずき3:会話の順番によっては情報の先後が逆になる

アドベンチャーゲームの話題カード選択式では、プレイヤーが話題を選ぶ順番をある程度自由に選べます。今回のゲームでは、沙耶の話題と磯部の話題のどちらを先に選ぶかはプレイヤー次第です。

当初の沙耶との「あの夜のこと」の会話で、こんなセリフを書いていました。

沙耶:「……田中さんが、男の子を北側に連れていくのを見たわ。北には廃旅館がある。」

ところがこのセリフを磯部との会話より先に聞いた場合、「廃旅館」という場所を沙耶から聞く前に磯部から聞くことになり、磯部が「廃旅館について」という話題を話すとき「さっき沙耶から聞いた場所だ」という文脈にならなくなります。

今回の対処として、沙耶からは「北側に連れていった」という事実だけを伝え、「廃旅館の存在」は磯部だけが教える情報として役割分担を明確にしました。

沙耶(修正後):「……田中さんが北側に連れていった。それだけ。」
磯部:「北には廃旅館がある。昔から島の人間しか知らん場所じゃ。」

どちらの順番で話を聞いても矛盾しない設計にすることが、話題カード選択式のゲームでは重要です。

ℹ️ 補足:完全にどの順番でも矛盾しない設計を目指すと、情報の出所がどこなのかを全組み合わせでチェックする必要があります。今回の規模(4キャラ×3〜4話題)でもかなり気を使いました。規模が大きくなるほどフローチャートやスプレッドシートで情報の依存関係を管理することをおすすめします。


CharacterDataとTopicDataを全キャラ分作る

会話データの入力が終わったら、キャラクターと話題カードのデータを全員分作ります。

🔧 詳しい手順

  1. Data/Characters/フォルダで右クリック→「MysteryADV」→「CharacterData」で以下の4つを作成する
    • Char_Matsumoto(松本 翔)
    • Char_Saya(桐島 沙耶)
    • Char_Tanaka(田中 浩二)
    • Char_Isobe(磯部 茂)
  2. Resources/Topics/フォルダで右クリック→「MysteryADV」→「TopicData」で15個の話題カードをすべて作成する
  3. 各TopicDataのInspectorに以下を設定する
    • Topic ID(識別用)
    • Topic Title(カードに表示される名前)
    • Dialogue(対応するDialogueDataをドラッグ&ドロップ)
    • Is Unlocked(最初から見える話題はオン、フラグで解放される話題はオフ)
    • Unlock Flag ID(解放に必要なフラグID)
  4. 各CharacterDataのTopics欄に、そのキャラクターの話題カードをすべてドラッグ&ドロップして登録する
Char_SayaのInspectorに4つの話題カードが登録されている状態

フラグ設計を見直す

全データを入力し終えたところで、フラグ設計に1か所見直しが必要になりました。

当初「松本の動画話題(Ch3_Matsumoto_Video)」はtalked_saya_pastフラグ1つで解放する設計にしていたのですが、シナリオ上「廃旅館の情報(磯部)」も聞いていないと動画を提示する流れが不自然になると気づきました。

そこで「talked_saya_pastかつtalked_isobe_ruinsの両方が立っているときに解放する」というコンボフラグを実装しました。

FlagManager.csに以下のメソッドを追加します。

void CheckComboFlags()
{
    // 沙耶から過去を聞き、かつ磯部から廃旅館情報を聞いたとき→動画話題を解放
    if (HasFlag("talked_saya_past") && HasFlag("talked_isobe_ruins"))
    {
        SetFlag("ready_for_video");
    }
}

OnFlagChanged()の末尾にCheckComboFlags()の呼び出しを追加します。

void OnFlagChanged(string flagID)
{
    UnlockTopicsByFlag(flagID);
    CheckComboFlags();
}

そしてCh3_Matsumoto_VideoのTopicDataのUnlock Flag IDをready_for_videoに設定します。これで2つの条件が揃ったときだけ動画話題が解放されるようになります。


完成して振り返って

⚠️ ハマったポイント

  • 台本を書くときと、実際にUnityで入力して通しで読むときでは、気づく問題が全然違う。「情報の出所」「名前が出る前に名前を言っていないか」「話題の順番が変わっても矛盾しないか」は、実際に入力してみて初めて見える問題が多い
  • 話題カード選択式のゲームでは、プレイヤーが話題を選ぶ順番が自由になる分、「どの順番で聞いても矛盾しない」設計が必要。今回の規模でも15通りの話題の順番のすべてを意識するのは難しく、重要な情報については「誰から聞く情報か」を明確に役割分担した
  • 複数のフラグが揃ったときだけ解放するコンボフラグは、シナリオに論理的な流れを作るのに効果的。FlagManagerにCheckComboFlags()を追加するだけで対応できる
  • DialogueDataの入力は地道な作業だが、入力しながらセリフを読み直すことでシナリオのブラッシュアップができる。「入力作業」と「シナリオ修正」を同時並行で進めるつもりで臨むと良い
  • 19本すべてを入力し終えてからフラグ設計の修正が必要になることもある。フラグ設計は「完成品」ではなく「生きているドキュメント」として、ゲームが形になるにつれて更新し続けるものだと考えると気が楽になる

次回予告

第7回では、まずCSVから会話データ・話題カード・キャラクターデータを一括インポートするエディタ拡張を作り、Inspectorへの手入力から解放されます。そのうえで、AIで生成したキャラクター立ち絵と背景画像をUnityに取り込み、会話シーンに表示する実装を行います。


あわせて読みたいおすすめ書籍【PR】

シリーズを通じて参考になった書籍をまとめて紹介します。本セクションにはアフィリエイトリンクを含みます。

※このセクションのリンクはアフィリエイトリンクであり、商品が購入された場合、サイト運営者に紹介料が支払われることがあります【PR】。


この記事を作成するにあたって参考にしたサイト

コメント

タイトルとURLをコピーしました