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

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

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

ゲームの設定を用意する

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

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

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

手順

クエストを追加する

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

「機能を追加」でクエストを検索し、カードの「追加」を押す

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

クエストのカードに「追加済み」と表示された状態

クエストグループを作る

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

クエストグループの表。ID が main の行を作り、開催スケジュールは空欄にする

表示名の列を追加する

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

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

列を追加する画面。displayName を文字列の必須項目として追加する

森の探索を登録する

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

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

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

クエストの表を右へスクロールし、displayName に森の探索を入力した状態

サーバーと Unity へ反映する

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

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

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

}

この章の AdventureStudioView.cs をダウンロード

設定をデプロイする

この章のテンプレートをダウンロードし、コンソールの Deploy → スタックを新規作成から、スタック名 adventure-game で作成します。テンプレートデータでダウンロードしたファイルを選びます。adventure-login はそのまま残します。

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

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 を割り当てます。再生してログインすると、冒険の一覧が表示されます。

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;
        }
    }
}

AdventurePlay.cs をダウンロード

一覧を開いてみましょう

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

練習:設定を変えて試す

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

次の章へ進む前に

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

次へ:冒険を開始し、報酬を受け取る