【実践記事・ADV編②】Unityでアドベンチャーゲームを作る前に決めること——環境構築とシステム設計

初心者向け実践開発

対応バージョン:Unity 6.3 LTS(6000.3系)/WebGL出力 この記事はシリーズ全11回の第2回です。第1回では企画・設定・台本の書き方を解説しました。今回からいよいよUnityを開きます。 【PR】本記事にはアフィリエイトリンクを含みます。

前回の記事で「どんなゲームを作るか」の骨格が固まりました。今回はUnityのプロジェクトを作成し、ゲーム全体のシステム設計と、データ管理の仕組みを整えます。

実装を始める前の「下ごしらえ」の話ですが、ここをきちんとやっておくと後半のコーディングがスムーズになります。逆にここが曖昧なまま進むと、後から設計を直したくなったときに大きな手戻りが発生します。

目次


プロジェクト作成

🔧 詳しい手順

  1. Unity Hubを開き、「New project」をクリックする
  2. Editor versionでUnity 6.3 LTS(6000.3系)を選択する
  3. テンプレート一覧の「Core」タブから**「Universal 2D」**を選択する(「2D(Built-in Render Pipeline)」は旧式なので選ばない)
  4. プロジェクト名を「MysteryADV」と入力し、「Create project」をクリックする
  5. プロジェクトが開いたら、メニューの「File」→「Save As Scene…」でシーン名を「SampleScene」のまま保存する(あとでリネームするので今は何でもよい)

ここまでは前回のキャッチゲーム・ランナーゲームと同じ手順です。Unity 6では従来の「C# Script」が「MonoBehaviour Script」という名称になっています。前回の記事でつまずいた方はご注意ください。

⚠️ Unity 6特有の注意点 プロジェクト作成直後は「Active Input Handling」が「Input System Package (New)」のみに設定されていることがあります。Input.GetKeyなどの旧API系を使う場合はEdit → Project Settings → Player → Active Input Handling を「Both」に変更しておくと安全です。詳しくは前回の実践記事(キャッチゲーム編)を参照してください。

Unity HubでMysteryADVプロジェクトを作成している画面

フォルダ構成の考え方

プロジェクトを開いたら、Assetsフォルダの中にすぐコードを書き始めたくなりますが、最初にフォルダ構成を決めておくことをおすすめします。ファイルが増えてきたときに「どこに何があるか分からない」という状態を防げます。

今回のMysteryADVでは以下のフォルダ構成にしました。

Assets/
├── Scenes/          // シーンファイル
├── Scripts/
│   ├── Dialogue/    // 会話システム関連
│   ├── System/      // フラグ・証拠・シーン管理
│   └── UI/          // UI制御関連
├── Prefabs/         // プレハブ
├── Sprites/
│   ├── Backgrounds/ // 背景画像
│   ├── Characters/  // キャラクター立ち絵
│   ├── Fonts/       // フォントファイル
│   └── UI/          // UIパーツ
├── Data/
│   └── Dialogues/   // ScriptableObjectの会話データ
└── Resources/
    ├── Topics/      // 話題カードデータ
    └── Evidences/   // 証拠データ

ポイント:ResourcesフォルダをScripts/の外に置く理由

Resources/フォルダはUnityの特殊フォルダで、Resources.LoadAll<T>()という関数を使うとフォルダ内のアセットを実行時に動的に読み込めます。今回のゲームでは「フラグが立ったら話題カードを自動解放する」という仕組みを実装するために、このフォルダを使います。詳しくは第4回で解説します。

🔧 詳しい手順

  1. ProjectウィンドウのAssetsフォルダで右クリック→「Create」→「Folder」で上記のフォルダをすべて作成する
  2. Resources/Topicsフォルダ、Resources/Evidencesフォルダは特に忘れずに作成する(このフォルダ名のスペルミスが後で大きな問題になる。「Resources」のrは2つあることに注意)

⚠️ 実際にハマったミス 今回の開発中、「Resources」を「Resoueces」(rを1つ抜かし)とタイポしたまま進めてしまい、フラグを立てても話題カードが解放されないという不具合が起きました。Resources.LoadAll<T>()はフォルダ名が正確に「Resources」でないと動きません。フォルダを作ったあとに綴りを確認する癖をつけておくと安心です。

MysteryADVのProjectウィンドウのフォルダ構成

ScriptableObjectでデータを管理する

このゲームで一番重要な設計の選択が「会話データをどこに持つか」でした。

最初に思いつくのはスクリプトの中にセリフを直接書く方法ですが、これだと台本を修正するたびにコードを開いて保存し直す必要があります。セリフが19本分(今回のゲームのDialogueData数)あると、それだけで大変な作業になります。

そこで今回はScriptableObjectを使いました。ScriptableObjectはUnityの仕組みで、データだけを持つアセット(ファイル)をUnityのProjectウィンドウ上で作成・編集できるようにする機能です。

ScriptableObjectを使うと以下のメリットがあります。

  • セリフを修正したいときはスクリプトを触らず、Inspectorの欄に直接入力するだけで変更できる
  • キャラクターごと・話題ごとにファイルが分かれるので管理しやすい
  • プログラマーとシナリオ担当が別の人でも、シナリオ担当はコードを触らずデータだけ編集できる

ScriptableObjectの作り方

ScriptableObjectを使うには、クラスがMonoBehaviourではなくScriptableObjectを継承している必要があります。また、クラス定義の上に[CreateAssetMenu(...)]という属性を付けることで、ProjectウィンドウのCreateメニューから新しいデータを作れるようになります。

using UnityEngine;

[CreateAssetMenu(fileName = "DialogueData", menuName = "MysteryADV/DialogueData")]
public class DialogueData : ScriptableObject
{
    public string sceneTitle;
    public DialogueLine[] lines;
}

保存してUnityエディタに戻ると、ProjectウィンドウでCreate→「MysteryADV」→「DialogueData」という新しいメニュー項目が出てきます。これを選ぶたびに新しい会話データのファイルが作られます。

ℹ️ 補足[CreateAssetMenu]が機能するには、クラスが必ずScriptableObjectを継承している必要があります。MonoBehaviour Scriptとして作成したあとで中身を書き換えた場合は、MonoBehaviourScriptableObjectの変更を忘れずに。

DialogueDataのInspector画面。セリフを直接入力できる

全システムの設計図

実装を始める前に、ゲーム全体でどんなシステムが必要かを整理しました。

【システム一覧】

DialogueSystem(会話システム)
  └ DialogueData     // 1つの会話のデータ(ScriptableObject)
  └ DialogueLine     // 1行分のセリフのデータ
  └ DialogueManager  // 会話の再生・管理

TopicCardSystem(話題カードシステム)
  └ TopicData        // 1つの話題カードのデータ(ScriptableObject)
  └ CharacterData    // 1人のキャラクターのデータ(ScriptableObject)
  └ TopicCardManager // 話題カードUIの表示・管理

FlagManager(フラグ管理)
  └ フラグの追加・確認
  └ フラグに応じた話題カードの自動解放

EvidenceSystem(証拠システム)
  └ EvidenceData     // 1つの証拠のデータ(ScriptableObject)
  └ EvidenceManager  // 証拠の管理・フラグ付与
  └ EvidenceNotifier // 入手通知UIの表示

SceneController(シーン遷移)
  └ エンディングシーンへの遷移

EndingManager(エンディング管理)
  └ 証拠チェック
  └ TRUE END / BAD ENDの分岐

これを見ると、ゲームの中心にあるのは「フラグ」だということが分かります。

  • 会話を聞く → フラグが立つ → 新しい話題カードが解放される
  • 証拠を入手する → フラグが立つ → 追及コマンドが解放される
  • 追及に成功する → フラグが立つ → エンディング選択が解放される

すべての進行がフラグによって管理されています。この「フラグを中心に設計する」という考え方は、アドベンチャーゲームの基本です。

実装の順番

設計図が固まったら、実装する順番を決めました。

STEP1:DialogueSystem(会話テキスト送り)
  → まず「セリフが表示できる」状態を作る

STEP2:TopicCardSystem(話題カード選択UI)
  → 「どの話題を選ぶか」のUIを作る

STEP3:FlagManager(フラグ管理)
  → 「会話したら次の話題が増える」仕組みを作る

STEP4:EvidenceSystem(証拠入手・通知)
  → 「証拠を持つ」仕組みを作る

STEP5:シーン遷移・エンディング分岐
  → 「ゲームが終わる」仕組みを作る

STEP6:WebGL出力・ブラウザ動作確認
  → ブラウザで動かす

「動く最小単位」から順番に積み上げる方針にしました。最初からすべてを繋ごうとすると、どこで何が起きているかデバッグしにくくなります。

GameManagerに全システムがアタッチされた状態のInspector

完成して振り返って

プロジェクト作成とフォルダ構成・設計図まで作り終えて気づいたことをまとめます。

⚠️ ハマったポイント

  • Resourcesフォルダのスペルミスは防ぎにくい。フォルダ名のタイポはコンパイルエラーにも警告にもならず、後から「なぜ動かないのか」を追うのに時間がかかります。フォルダを作ったら必ず名前を確認する習慣を
  • ScriptableObjectはゲームのデータ管理の強力な味方。コードとデータを分離するという考え方は、ゲームが複雑になるほど効いてきます。セリフを19本入力するときに「Inspectorに直接打ち込める」かどうかは、作業効率に大きく影響しました
  • 設計図を先に書くと、実装中に迷わない。「次に何を作ればいいか」が常に明確なので、「とりあえず動かしてみる」という試行錯誤の時間が減りました

次回予告

第3回では、DialogueSystemとTopicCardSystemを実際に実装します。ScriptableObjectにセリフを入力して、ボタンを押すとセリフが進む「会話システム」を動かすところまで進みます。日本語フォントの設定でつまずいたポイントも包み隠さず書きます。


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

今回のシステム設計・フォルダ構成・ScriptableObjectについてさらに深く学びたい方には、以下の書籍もおすすめです。本セクションにはアフィリエイトリンクを含みます。

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


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

コメント

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