見出し画像

UnityでGoogleスプレッドシートを読み込む基本|ビルドし直さずにデータを更新する方法

前回の記事では、Unityの Resources.Load() を使って、Textデータを読み込む方法を紹介しました。

ResourcesフォルダにTextファイルやCSVファイルを入れておくと、Unity内でそのデータを読み込み、リストや配列として使うことができます。

ただし、この方法にはひとつ注意点があります。

それは、データを変更したい場合、基本的にはUnity側のデータを修正して、もう一度ビルドする必要があるという点です。

たとえば、クイズアプリを作っていて、

  • 問題文を変更したい

  • 選択肢を追加したい

  • 答えを修正したい

  • 時事問題を新しくしたい

という場合、Resourcesフォルダ内のTextデータを修正し、アプリを再ビルドする必要があります。

そこで今回は、Resourcesフォルダではなく、GoogleスプレッドシートからTextデータを読み込む方法を紹介します。

Googleスプレッドシートを使うと、アプリをビルドし直さなくても、スプレッドシート側の内容を更新するだけで、Unity側で読み込むデータを変更できるようになります。

特に、クイズ問題やお知らせ機能、イベント情報、時事問題など、あとから内容を変更したいデータと相性が良い方法です。



事例1:クイズの設問と答え

Googleスプレッドシートは、クイズアプリと相性が良いです。

たとえば、次のようなクイズデータをGoogleスプレッドシートで管理できます。

このように表で管理しておけば、

0列目:問題
1列目:正解
2列目:ダミー1
3列目:ダミー2
4列目:ダミー3

のように、Unity側で扱うことができます。

特に時事問題の場合、内容が変わるたびにアプリを更新するのは大変です。

しかし、Googleスプレッドシートからデータを読み込む形にしておけば、スプレッドシート側を書き換えるだけで、新しい問題に差し替えることができます。


Googleスプレッドシート

Googleスプレッドシートを作成する

まず、Googleスプレッドシートを開いて、次のような表を作ります。

1行目は見出しです。
2行目以降に、実際のデータを入力します。
シート名を「Quizデータ」にしておきます(任意で指定してください)

今回は例としてクイズデータにしていますが、他にも、

お知らせ文
セリフデータ
ステージ情報
アイテム一覧
イベント情報

などにも使えます。


GoogleスプレッドシートをWebに公開

次に、Unityから読み込めるように、GoogleスプレッドシートをWebに公開します。

手順は次の通りです。

1. Googleスプレッドシートを開く
2. 画面上部の「ファイル」⇒ 「共有」を選択 ⇒「ウェブに公開」を選択

3. 公開するシートを選ぶ
4. 形式を「カンマ区切り値(.csv)」にする
5. 「公開」をクリック、確認メッセージが出たら「OK」で公開

6. 表示されたURLをコピーする

Google公式ヘルプでも、Google Sheetsなどのファイルは「ファイル」→「共有」→「ウェブに公開」から公開できると案内されています。公開すると、設定によってはWeb上のユーザーが見られる状態になるため、個人情報や非公開情報を入れないように注意が必要です。


「共有」と「ウェブに公開」の違い

ここで少し注意です。

Googleスプレッドシートには、

共有
ウェブに公開

という似たような設定があります。

共有

「共有」は、特定の人にスプレッドシートを見せたり、編集してもらったりするための設定です。

たとえば、

この人だけ閲覧できる
この人だけ編集できる
リンクを知っている人だけ閲覧できる

というような設定です。

ウェブに公開

一方、「ウェブに公開」は、スプレッドシートの内容をWeb上に公開するための設定です。

UnityからCSVとして読み込む場合は、基本的にこちらを使います。

ただし、公開したデータは、URLを知っている人から見られる可能性があります。

そのため、次のような情報は入れないようにしましょう。

  • パスワード

  • 個人情報

  • 住所・電話番号

  • メールアドレス

  • 非公開の業務データ

  • 見られて困る答えや内部データ


Unityのプログラム

オブジェクト類の準備

次に、Unity側の準備をします。

まず、空のGameObjectを作成します。

  1. 1. Hierarchyで右クリック

  2. 2. Create Emptyを選択

  3. 3. 名前を GoogleSheetReader に変更

次に、スクリプトファイル「GoogleSheetReader」を作成します。


Googleスプレッドシートを読み込む基本コード

今回は、まずGoogleスプレッドシートの中身を取得して、Consoleに表示するだけのシンプルなコードにします。

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class GoogleSheetReader : MonoBehaviour
{
    [SerializeField] string url;    // Gpple Sheetsの公開URLをInspectorで設定

    void Start()
    {
        StartCoroutine(ReadSheet());
    }

    IEnumerator ReadSheet()
    {
        UnityWebRequest request = UnityWebRequest.Get(url); // URLからデータを取得するリクエストを作成

        yield return request.SendWebRequest();  // リクエストの送信と完了まで待機

        if (request.result == UnityWebRequest.Result.Success)   // リクエストが成功した場合
        {
            Debug.Log(request.downloadHandler.text);  // 取得したデータをログに出力
        }
        else                                                    // リクエストが失敗した場合
        {
            Debug.LogError(request.error);  // エラーが発生した場合はエラーメッセージをログに出力
        }
    }
}

このスクリプトを、先ほど作成した GoogleSheetReader オブジェクトにアタッチします。

Inspectorに Url という入力欄が表示されるので、Googleスプレッドシートから取得したCSVのURLを貼り付けます。

Unityで再生して、Consoleにスプレッドシートの内容が表示されれば成功です。

UnityのConsoleでは、複数行のCSVをDebug.Logで表示した場合、一覧には先頭行だけが表示されることがあります。
その場合は、Consoleのログをクリックして、下側の詳細表示を確認してください。
詳細表示に2行目以降のデータも表示されていれば、Googleスプレッドシートの読み込みは成功しています。

Unityの UnityWebRequest.Get は、指定したURLからテキストやバイナリなどのシンプルなデータを取得するために使えるメソッドです。今回のようにCSVのURLから文字列を取得する用途にも使えます。


コードの簡単な解説

UnityWebRequest.Get(url)

UnityWebRequest request = UnityWebRequest.Get(url);

この部分で、指定したURLにアクセスする準備をしています。

今回は、GoogleスプレッドシートをCSVとして公開したURLを指定します。


yield return request.SendWebRequest();

yield return request.SendWebRequest();

ここで実際に通信を行います。

インターネットからデータを取得する処理は、すぐに終わるとは限りません。

そのため、コルーチンを使って、読み込みが終わるまで待っています。


request.downloadHandler.text

Debug.Log(request.downloadHandler.text);

読み込みに成功すると、取得したCSVデータを文字列として受け取ることができます。

今回は、その文字列をConsoleに表示しています。


配列の作成

続いて読み込んだデータを string型の配列に格納するコードを追加します。先に作ったコードもあるので、重複しないように気を付けてください。

public class GoogleSheetReader : MonoBehaviour
{
    [SerializeField] string url;    // Google Sheetsの公開URLをInspectorで設定
    string[,] quizArray;            // タイトル行を除いたクイズデータを入れる2次元配列

    void Start()
    {
        StartCoroutine(ReadSheet());
    }

    IEnumerator ReadSheet()
    {
        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();
        if (request.result == UnityWebRequest.Result.Success)
        {
            string text = request.downloadHandler.text;

            // 改行ごとに分ける
            string[] rows = text.Split('\n');

            // 1行目のタイトル行を除いた行数
            int rowCount = rows.Length - 1;

            // 1行目をカンマで分けて、列数を取得
            int columnCount = rows[0].Trim().Split(',').Length;

            // 2次元配列を作成
            quizArray = new string[rowCount, columnCount];

            // 2行目以降を2次元配列に入れる
            for (int i = 1; i < rows.Length; i++)
            {
                string[] columns = rows[i].Trim().Split(',');

                for (int j = 0; j < columnCount; j++)
                {
                    quizArray[i - 1, j] = columns[j];
                }
            }

            Debug.Log("クイズデータを2次元配列に格納しました");

            // 確認用
            Debug.Log(quizArray[0, 0]); // 日本の首都は?
            Debug.Log(quizArray[0, 1]); // 東京
        }
        else
        {
            Debug.LogError(request.error);
        }
    }
}

ポイントはここです。

string[,] quizArray;

これで2次元配列になります。

そして、

quizArray = new string[rowCount, columnCount];

で、

何行分あるか
何列分あるか

を指定して配列を作っています。

今回なら、見出しを除いて3問、列は5列なので、

quizArray = new string[3, 5];

というイメージです。

次に、

quizArray[i - 1, j] = columns[j];

ここで各セルのデータを入れています。

i はCSV全体の行番号です。
ただし、1行目のタイトル行を飛ばしているので、quizArray に入れるときは i - 1 にします。

rows[1] → quizArray[0, 0〜4]
rows[2] → quizArray[1, 0〜4]
rows[3] → quizArray[2, 0〜4]

という対応です。

このあたりは、前回紹介したTextデータを配列やリストにする考え方と同じです。


Googleスプレッドシートを使うときの注意点

Googleスプレッドシートからデータを読み込む方法は便利ですが、いくつか注意点もあります。

インターネット接続が必要

Googleスプレッドシートはインターネット上のデータです。

そのため、アプリを使う端末がインターネットに接続されていない場合、データを取得できません。

完全にオフラインで使うアプリの場合は、Resourcesフォルダにデータを入れておく方法の方が向いています。

公開してよいデータだけを使う

CSVとして公開したGoogleスプレッドシートは、URLを知っている人が見られる可能性があります。

そのため、個人情報やパスワードなど、見られて困るデータは入れないようにしましょう。

クイズ問題、お知らせ文、イベント情報など、公開されても問題ないデータに使うのがおすすめです。

カンマを含む文章に注意

CSVは、カンマで列を分ける形式です。

そのため、セルの中にカンマが入っていると、単純な分割ではうまく扱えない場合があります。

初心者向けには、まずはセルの中にカンマを入れないようにしておくと安全です。

本格的に使う場合は、CSVを正しく解析する処理や、JSON形式での管理も検討するとよいと思います。

反映までの時間

Googleスプレッドシートを更新しても、環境によってはUnity側にすぐ反映されない場合があります。

その場合は、

  • 少し時間を置く

  • Unityを再生し直す

  • URLが正しいか確認する

  • 公開設定が有効か確認する

といった点を確認してみてください。


Resources.Loadとの使い分け

最後に、Resources.LoadとGoogleスプレッドシートの使い分けを整理しておきます。

Resources.Loadが向いているケース

  • アプリ内に固定データとして入れておきたい

  • オフラインでも使いたい

  • データを頻繁に変更しない

  • 画像や音声、プレハブなどを読み込みたい

Googleスプレッドシートが向いているケース

  • あとからデータを変更したい

  • ビルドし直さずに内容を更新したい

  • クイズ問題を追加したい

  • 時事問題を扱いたい

  • お知らせ文を更新したい

  • 季節イベントの内容を変更したい

固定データはResources、あとから更新したいデータはGoogleスプレッドシート、という考え方をするとわかりやすいです。


まとめ

今回は、UnityでGoogleスプレッドシートのデータを読み込む基本的な方法を紹介しました。

前回のResources.Loadでは、Unity内にあるTextデータを読み込みました。

今回は、Googleスプレッドシートにある外部データを読み込みました。

Googleスプレッドシートを使う大きなメリットは、アプリをビルドし直さなくても、データを更新できることです。

特に、

  • クイズ問題

  • 時事問題

  • お知らせ

  • イベント情報

  • セリフデータ

  • ステージ情報

のように、あとから内容を変更したいデータと相性が良い方法です。


▼ Unity初心者向け記事まとめはこちら


こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

さらにステップアップの「スマホで遊ぶジャンプゲーム 8回セット」のマガジンもぜひご活用ください。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。


いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!