i-school - スプレッドシートのシート別の情報を異なるスクリプタブル・オブジェクトに取り込む
 Google の SpreadSheet(スプレッドシート。以下、GSS とします)のシートの情報を1シートにつき、1つのスクリプタブル・オブジェクトに取り込む方法について学習します。

 こちらの記事を参考に作成しています。ありがとうございます。
ドクロモエ 様
【Unity】Google スプレッドシートから直接データを読む方法
https://dokuro.moe/unity-how-to-import-google-spre...

 非同期処理についてはコルーチンを利用していますが、UniTask(async/await)を利用した実装方法の教材もあります。
そちらを利用した実装を行いたい場合には、この教材を最後まで進めていただき、終了後に別の教材へ移行してください。(最後にリンクがあります)



事前準備


 スプレッドシートの情報を Unity 内に取り込んで利用できる状態にするため、
スプレッドシートの内容をクラスとして作成し、それをスクリプタブル・オブジェクトとして管理できるようにしておきます。


SkillData スクリプトを作成する


 これはサンプルです。ご自分のデータの内容に合わせて適宜変更をお願いします。

 クラスの名称はスプレッドシートのシート名と同じにしておきます。
宣言する変数はすべて public 修飾子とし、スプレッドシートの項目と同じ内容で設定します。


スプレッドシートのシート名



スプレッドシートの項目名



SkillData.cs

 <= クリックすると開きます


 スプレッドシートからの情報をすべて文字列として取得して利用する形になります。
そのため、各シート用のクラスにはコンストラクタ・メソッドを用意し、string[] 配列の形で引数を受け取って
文字列以外のデータ型については、それをキャストしてから変数に代入する処理を記述します。


SkillDataSO スクリプトを作成する


 作成した SkillData クラスをスクリプタブル・オブジェクトとして活用できるようにします。


SkillDataSO.cs

 <= クリックすると開きます


 完成したら、スクリプタブル・オブジェクトのアセットを作成しておいてください。
Size は 0 で問題ありません。


DataBaseManager スクリプトを作成する


 作成したスクリプタブル・オブジェクト(アセット)を変数として登録し、ゲーム内で利用できる状態にするクラスをシングルトンクラスとして作成します。


DataBaseManager.cs

 <= クリックすると開きます


 完成したら、空のゲームオブジェクトを作成し、名前を DataBaseManager に変更し、このスクリプトをアタッチしてください。

 インスペクターより変数にスクリプタブル・オブジェクト(アセット)をドラッグアンドドロップしてアサインして登録し、利用できる状態にしてください。


スプレッドシートを読み込んでスクリプタブル・オブジェクトに取り込むための処理を作成する


 2つのクラスを作成します。
GSSReader クラスでは、スプレッドシートのシートへアクセスして情報を取得します。
GSSReciver クラスでは GSSReacer クラスが取得した情報をスクリプタブル・オブジェクトへと取り込む処理を行います。

 参考にさせていただいている記事を元に作成していますので、処理の大筋は変わりませんが、
こちらでは、1つのスプレッドシートの複数のシートから複数のスクリプタブル・オブジェクトへの取り込み処理を行えるように修正しています。


GSSReader スクリプトを作成する


 スプレッドシートにアクセスし、シート内の情報をシートごとに取得しておくためにクラスです。
取得した情報は SheetData クラスに保持し、配列としておくことで複数のシートの情報を保持しています。


GSSReader.cs

 <= クリックすると開きます



GSSReceiver スクリプトを作成する


 スプレッドシートから取得したデータが GSSReacer クラスの SheetData 配列変数内に格納されているので、
それをシート単位で任意のスクリプタブル・オブジェクトに値として取り込むためのクラスです。

 処理の内容としては、こちらのクラスが起点となって GSSReacer クラスへ取得命令を出し、
取得した情報をこちらで受け取ってスクリプタブル・オブジェクトに代入しています。


GSSReceiver.cs

 <= クリックすると開きます



Editor フォルダ


 今回参考にさせていただいているサイト内では Editor 拡張用のスクリプトが作成されています。
こちらの作成は任意です。作成しなくても問題ありませんので、不要な場合にはスキップしてください。
もしも Editor 拡張用のスクリプトを作成した場合には、Assets フォルダの直下に Editor フォルダを作成して、そちらに拡張用のスクリプトを配置してください

 Editor 拡張用のスクリプトがある際にビルドを行うとエラーが発生します。
これは Editor 拡張用のスクリプトがビルド時に読み込まれることによって発生しています。

 Editor フォルダに Editor 拡張用のスクリプトを配置することにより、ビルド時に Editor フォルダ内のスクリプトは除かれるようになりますので
このエラーを回避することが出来るようになります。





スプレッドシートの用意


 SkillData スクリプトの変数をラベルとし、SkillData スクリプト内で宣言した変数と順番と同じ順番と同じ名前で項目と作り、値については自由に作成してください。
またシートの名称も SkillData としておいてください。

 すでにシートが用意してある場合には、下記の「表示形式」の設定だけ行ってください。

 スプレッドシートの作成時の注意点については、先ほどのサイトを参考にしてください。
特にシートの「表示形式」についてはすべてのセルを「書式なし」に変更してください。(シート全体を選択して設定してください)
また、利用していないセルは削除してください。






 再度、サンプルを提示します。
実際にはご自分のデータに合わせてクラスを作成してください。


シート名



セルの内容(1行目にラベル用の項目。SkillData スクリプト内の変数の並びと名称に合わせる)



スプレッドシート側の設定


 スプレッドシート側は GoogleDrive で対象のファイルを選択し、共有かリンクの取得を選択し、「リンクを知っている全員が閲覧可能な状態」に設定します。
リンクのシートのアドレスの末尾が usp=sharing であれば共有設定がされています

 共有設定が行われていないと、読み込みに失敗します




GSSConveter ゲームオブジェクトを作成し、GSSReader スクリプトと GSSReceiver スクリプトをアタッチして設定を行う


 ヒエラルキー内に新しいゲームオブジェクトを作成し、名前を GSSConveter に変更します。
GSSConveter ゲームオブジェクトに先ほど作成した GSSReader スクリプトと GSSReceiver スクリプトをアタッチします。
 
 GSSReader スクリプトの変数に情報を登録します。

 SheetID 変数にはスプレッドシートの中から該当する URL(アドレス)を登録します
先ほどのサイトも参照してください。


登録する部分



 OnLoadEnd 変数にはメソッドを登録します。この部分に登録したメソッドが、スプレッドシートのデータを取得後に実行されます。
Editor And Runtime の設定に変更したうえで、同じゲームオブジェクトにアタッチされている GSSReceiver コンポーネントを登録し、その中から OnGSSLoadEnd メソッドを登録します。
なお設定が Runtime になっていると実行しても失敗しますので注意してください。


インスペクター画像



 上記画像の補足としまして、Editor 拡張用のスクリプトを作成していると「スプレッドシート読み込み」ボタンが表示されます。
作成していない場合には表示されません。


ゲームを実行して動作を確認する


 スプレッドシートの読み込みですが、ゲームを実行してから行わないと、スクリプタブル・オブジェクトのインスタンスがないために失敗します。
そのため、Editor 拡張を行った際のインスペクターのボタンからは事前に試さないようにしてください。

 ゲームを実行すると、自動的にスプレッドシートの読み込みと、読み込んだ情報をスクリプタブル・オブジェクトに取り込む処理が実行されます。

 SkillDataSO スクリプタブル・オブジェクトを確認し、Size が 0 ではなく、スプレッドシートの行の数分になっており、値が代入されているかを確認してください。








複数のシートの情報をそれぞれ異なるスクリプタブル・オブジェクトに取り込む


 新しくスクリプタブル・オブジェクト用のスクリプトを作成し、スクリプタブル・オブジェクトを作成してください。

 次に、スプレッドシートのシートを増やして、スクリプタブル・オブジェクトに取り込みたい情報を SkillData と同じように記述します。

 GSSConverter ゲームオブジェクトの GSSReader スクリプトの SheetDatas 変数の Size を変更し、シートの名称の列挙子を登録します。

 そして、GSSReceiver スクリプトの中に、スクリプタブル・オブジェクトの代入処理を作成してください。
SkillDataSO スクリプタブル・オブジェクトの代入処理が参考になります。





 あとはゲームを実行すれば、複数のスクリプタブル・オブジェクトに、それぞれの対応するシートの情報を取り込むことが出来ます。
スプレッドシートを読み込む GSSReader の方はインスペクターからシートの名前を設定するだけで済みます。



 以上になります。
色々と試してみてください。

 
 UniTask を利用した GSS のシートをスクリプタブル・オブジェクトに取り込む方法についてはこちらです。