> For the complete documentation index, see [llms.txt](/ja/llms.txt)


# 2. 冒険を登録して一覧に表示する

最初の冒険「森の探索」を登録して、ゲームの画面に表示してみましょう。



ログインできるようになったので、次は冒険の一覧を作りましょう。最初の冒険は「森の探索」です。冒険を GS2 ではクエストと呼び、クエストグループにまとめて管理します。今回はクエストグループ `main` に `forest` として登録し、画面に名前を表示してみます。

## ゲームの設定を用意する

冒険の名前や報酬など、開発者が決めるゲームの設定を「マスターデータ」と呼びます。一方、プレイヤーが持っているコインや、どの冒険の途中かを表すものは「ユーザーデータ」です。まずは、一覧に表示するマスターデータを作ります。

`forest` はプログラムが冒険を指定するための識別子で、「森の探索」はプレイヤーに見せる名前です。二つを分けておくと、画面上の名前を変えても、プログラムでは同じ冒険として扱えます。

一覧を表示するための設定を作ります。開始時の消費と報酬の設定欄は、空にしておきます。

## 手順



**Studio**

### クエストを追加する

第1章で使った Studio の `Adventure` プロジェクトを開きます。**機能を追加**で `クエスト` を検索し、カードの**追加**を押してください。

<a href="/images/adventure/studio-2026-11-3/quest-search.jpg" target="_blank" rel="noopener" aria-label="「機能を追加」でクエストを検索し、カードの「追加」を押す（別タブで拡大）"><img src="/images/adventure/studio-2026-11-3/quest-search.jpg" alt="「機能を追加」でクエストを検索し、カードの「追加」を押す" loading="lazy"></a>

**追加済み**と表示されるまで待ちます。クエストが使う「スケジュール基盤」も一緒に追加されます。

<a href="/images/adventure/studio-2026-11-3/quest-added.jpg" target="_blank" rel="noopener" aria-label="クエストのカードに「追加済み」と表示された状態（別タブで拡大）"><img src="/images/adventure/studio-2026-11-3/quest-added.jpg" alt="クエストのカードに「追加済み」と表示された状態" loading="lazy"></a>

### クエストグループを作る

**表 → クエスト → クエストグループ（QuestCollection）** を開き、**行を追加**を押します。ID のセルを選んで Enter を押し、`main` と入力して Enter で確定します。開催スケジュールは空欄にします。

<a href="/images/adventure/later-chapters/02-quest-group.jpg" target="_blank" rel="noopener" aria-label="クエストグループの表。ID が main の行を作り、開催スケジュールは空欄にする（別タブで拡大）"><img src="/images/adventure/later-chapters/02-quest-group.jpg" alt="クエストグループの表。ID が main の行を作り、開催スケジュールは空欄にする" loading="lazy"></a>

### 表示名の列を追加する

クエストに、ゲームで表示する名前の列を追加しましょう。

1. **表 → クエスト → クエスト（Quest）** を開き、**構造** タブを選びます。
2. **アセット配信の列** にある **列を追加** を押します。
3. 列名を `displayName`、型を **string（文字列）** にします。**必須にする** をオンにして、**追加** を押します。

<a href="/images/adventure/later-chapters/02-display-name-column.jpg" target="_blank" rel="noopener" aria-label="列を追加する画面。displayName を文字列の必須項目として追加する（別タブで拡大）"><img src="/images/adventure/later-chapters/02-display-name-column.jpg" alt="列を追加する画面。displayName を文字列の必須項目として追加する" loading="lazy"></a>

### 森の探索を登録する

**データ** タブを開き、**行を追加** で次の行を作ります。文字や数値はセルを選んで Enter を押すと編集できます。クエストグループはセルを開いて `main` を選びます。アクションの列は **アイテムなし** のままにします。

| ID | クエストグループ | displayName | 開始時消費 | 通常クリア報酬 | 初回クリア報酬 | 失敗時アクション |
| --- | --- | --- | --- | --- | --- | --- |
| `forest` | `main` | 森の探索 | 0件 | 0件 | 0件 | 0件 |

`displayName` は表の右端にあります。横にスクロールして **森の探索** と入力し、保存します。

<a href="/images/adventure/later-chapters/02-quest-display-name.jpg" target="_blank" rel="noopener" aria-label="クエストの表を右へスクロールし、displayName に森の探索を入力した状態（別タブで拡大）"><img src="/images/adventure/later-chapters/02-quest-display-name.jpg" alt="クエストの表を右へスクロールし、displayName に森の探索を入力した状態" loading="lazy"></a>

### サーバーと Unity へ反映する

**反映 → サーバとの差分を確認**を押し、GS2 にサインインします。学習用プロジェクトと東京リージョンを選び、変更内容を確認してデプロイします。続いて**Unity プロジェクトを更新する**を実行します。

### 生成された一覧を画面に表示する

1. Unity の `Gs2` オブジェクトに `QuestListHandler` を追加し、**Collection** を `main` にします。下のコードで一覧を描くので Item Prefab と Content Parent は空欄のままです。
2. `Assets/AdventureStudioView.cs` を作り、次のコードを貼り付けます。
3. `Gs2` オブジェクトに `AdventureStudioView` を追加し、**Quests** に `QuestListHandler` を割り当てます。
4. 再生してログインすると、「森の探索」が表示されます。

```csharp
using Gs2.Unity.Util;
using System;
using UnityEngine;
using GS2Studio.Generated.Quest;

public sealed class AdventureStudioView : MonoBehaviour
{
    [SerializeField] private QuestListHandler quests;
    private string message = "";

    private void OnEnable()
    {
        if (quests != null) quests.Failed += ShowLoadError;
    }

    private void OnDisable()
    {
        if (quests != null) quests.Failed -= ShowLoadError;
    }

    private void ShowLoadError(Exception error)
    {
        message = "読み込めませんでした: " + error.GetType().Name;
    }

    private void OnGUI()
    {
        if (quests == null || Gs2GameSessionHolder.Instance == null || !Gs2GameSessionHolder.Instance.Initialized) return;
        GUILayout.BeginArea(new Rect(20, 100, 650, 650), GUI.skin.box);
        GUILayout.Label(message);
        if (!quests.IsLoaded) { GUILayout.Label("冒険を読み込み中です"); GUI.enabled = true; GUILayout.EndArea(); return; }
        foreach (var quest in quests.Binders)
        {
            GUILayout.Label(quest.DisplayName);
        }
        GUI.enabled = true;
        GUILayout.EndArea();
    }

}
```

<a href="/samples/adventure/02/AdventureStudioView.cs" download>この章の AdventureStudioView.cs をダウンロード</a>




**SDK（Unity）**

### 設定をデプロイする

<a href="/samples/adventure/02/adventure-game.yaml" download>この章のテンプレートをダウンロード</a>し、コンソールの **Deploy → スタックを新規作成**から、スタック名 `adventure-game` で作成します。**テンプレートデータ**でダウンロードしたファイルを選びます。`adventure-login` はそのまま残します。

クエストの設定は次の部分です。表示名は `metadata` に文字列として入れ、Unity も文字列として読みます。

```yaml
Settings:
  version: 2019-05-14
  groups:
    - name: main
      quests:
        - name: forest
          metadata: 森の探索
          contents:
            - weight: 1
              completeAcquireActions: []
          consumeActions: []
          firstCompleteAcquireActions: []
          failedAcquireActions: []
```

### 一覧表示のスクリプトを追加する

`Assets/AdventurePlay.cs` を作って次のコードを貼り付け、`Adventure` オブジェクトに追加します。Inspector の **Login** に、第1章の `AdventureLogin` を割り当てます。再生してログインすると、冒険の一覧が表示されます。

```csharp
using Cysharp.Threading.Tasks;
using System.Collections.Generic;
using Gs2.Unity.Gs2Quest.Model;
using UnityEngine;

public sealed class AdventurePlay : MonoBehaviour
{
    [SerializeField] private AdventureLogin login;
    private readonly List<EzQuestModel> quests = new List<EzQuestModel>();
    private bool ready;
    private string message = "読み込み中です";

    private void OnGUI()
    {
        if (login == null || login.Session == null) return;
        GUILayout.BeginArea(new Rect(20, 210, 650, 650), GUI.skin.box);
        GUILayout.Label(message);
        if (ready)
        {
            foreach (var quest in quests)
            {
                GUILayout.Label(quest.Metadata + " (" + quest.Name + ")");
            }
        }
        GUI.enabled = true;
        GUILayout.EndArea();
    }

    private void Start() => LoadQuests().Forget();

    private async UniTask LoadQuests()
    {
        try
        {
            await UniTask.WaitUntil(() => login.Session != null,
                cancellationToken: this.GetCancellationTokenOnDestroy());
            var group = login.Gs2.Quest.Namespace("adventure-quest").QuestGroupModel("main");
            await foreach (var item in group.QuestModelsAsync())
            {
                if (item != null) quests.Add(item);
            }
            ready = true;
            message = quests.Count == 0 ? "冒険がありません" : "読み込みました";
        }
        catch (System.OperationCanceledException) { }
        catch (System.Exception error)
        {
            message = "読み込めませんでした: " + error.GetType().Name;
        }
    }
}
```

<a href="/samples/adventure/02/AdventurePlay.cs" download>AdventurePlay.cs をダウンロード</a>






## 一覧を開いてみましょう

ゲームを起動してログインし、「森の探索」が一つ表示されることを確かめます。

## 練習：設定を変えて試す

名前を「森の見回り」に変えてみましょう。Studio ではデプロイと Unity 用アセットの更新を行い、SDK では設定を反映してクエストを読み込み直します。画面の名前も変わったでしょうか。デプロイ後、変更した設定がゲームに反映されるまで最大5分かかることがあります。変更前の名前が表示される場合は、少し待ってから Unity を再生し直して確認します。

## 次の章へ進む前に

表示名を変える練習をした場合は、「森の探索」に戻して反映します。グループは `main`、識別子は `forest`、消費と報酬はまだ設定していない状態です。

[次へ：冒険を開始し、報酬を受け取る]()



