はじめに
Google SpreadsheetのデータをScriptableObjectに反映させるための一例を紹介します。
Google spreadsheetは幅広く利用されており、実装者でなくても使いこなせるのが魅力です。見た目を作り込めば、ちょっとしたWebアプリに見えないこともないです。下のスクリーンショットは、前のプロジェクトで作ったサウンドさん用の作曲ツール(Spreadsheet)です。
ScriptableObjectはデータを格納できるオブジェクトです。パラメーターを変えるたびに、実行を止めて最初から始めなくてはならない、変えるたびに処理が走って待たされる、そんな経験があります。
ScriptableObjectはビルド対象外なので**値を変えても処理が走りません。**実行中でも値を変えられて、実行を解除しても値が残ります。レベルデザインなど変更の多い値はなるべくScriptableObjectにまとめたいものです。
前回のアドベントカレンダーの記事はこちらです。
プロジェクトが一区切りしたので、今まで気になっていた部分を、勉強したり実験したりしています。
今年のアドベントカレンダーで扱うサンプルは、すべて同じレポジトリにまとめています。
記事ではすべてのソースコードは掲載していませんので、全部見たい方はgithubをご参照ください。
作成したサンプル
仕様
- Spreadsheetで値を変更する。
- Unityの更新ボタンを押すと、ScriptableObjectの値が変更される。
- 値は、ゲームが実行中かどうか関わりなく、反映できる。
- ボタンを簡単に表示したり、要素を装飾したりする目的でOdin Inspectorを導入している。
実装の特徴
Inspectorのボタン
Odin Inspectorの機能を使用して、ボタンをInspectorに表示します。
この例では、ボタンが一番上に表示されるよう、優先順位を指定しています。
また、目立だつようボタンに色をつけてみました。
[PropertyOrder(0)] [LabelText("Spreadsheetを反映")]
[Button] [GUIColor(0, 1, 1)]
private void UpdateSpeechScore()
{
...
}
Inspectorのログ
進行度合いを知らせるため、ボタンの下にログを表示してみました。
[PropertyOrder(1)][HideLabel] [DisplayAsString] public string message;
複数のInspectorとLock
このボタンはエディタに常に表示したいので、Inspectorウィンドウを新たに追加し、右上のLockアイコンを押します。
下の画像では2つのInspectorウィンドウが左右に並んでいるのが確認できると思います。
Google Spreadsheetとの通信
Google apps scriptを使用して、Webアプリを作ります。
作り方の記事はたくさんあるので、ここでは省略します。
function doGet(e) {
let out;
switch (e.parameter.mode) {
case "test" :
let ss = SpreadsheetApp.getActive();
let sheet = ss.getSheetByName("Sheet_0");
let values = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues();
var json = {};
for (var i = 0; i < values.length; i++) {
json[values[i][0]] = values[i][1];
}
out = ContentService.createTextOutput(JSON.stringify(json, null, '\t'));
break;
default: break;
}
return out;
}
spreadsheetのセルの情報を取得、json形式にして、テキストで返します。
こちらをクリックすると、最新のspreadsheetのデータがjson形式で表示されると思います。
https://script.google.com/macros/s/AKfycbxXDOS7W9ChPktR3UFh8wf_4Phdadblpjn6Hg9OXwNVB5sSAGZUc9C8uhvB2Ab3JBrg/exec?mode=test
jsonの受け取り
受け取るjsonにあわせて、クラスを作ります。
[Serializable]
class WebData
{
public string key_0;
public string key_1;
}
JsonUtilityを使って変換します。
var data = JsonUtility.FromJson<WebData>(json);
ScriptableObjectへの書き込み
データを格納する形を決めます。
これだけでは使えないので、Projectウィンドのメニューからオブジェクトを作ってください。
この例では、Create/ScriptableObjects/GeneralParameter
で作成できます。
[CreateAssetMenu(menuName = "ScriptableObjects/GeneralParameter")]
public class GeneralParameter : ScriptableObject
{
public string param_0;
public string param_1;
}
jsonから変換したdataの値を渡してあげればそれでOK!
this.generalParameter.param_0 = data.key_0;
this.generalParameter.param_1 = data.key_1;