GoogleAppsScript
Unity

Google Spreadsheetに書いたシナリオをUnityのScriptableObjectにする

More than 3 years have passed since last update.


はじめに

Google Spreadsheetに書いたシナリオをScriptableObjectにするものを作りました。

こんな感じのシートを…

スクリーンショット 2015-10-04 19.21.40.jpg

UnityからGET通信でとってきて、ScriptableObjectに変換します。

スクリーンショット 2015-10-04 19.23.42.jpg


Spreadsheetの用意


Spreadsheetを作成

まずはデータを書くSpreadsheetを用意します。

こんな感じでSpreadsheetを作ります。

スクリーンショット 2015-10-04 19.30.58.jpg

A列に適当なデータを入力しておいてください。

ダミーデータの生成はここが便利です。

http://lipsum.sugutsukaeru.jp/index.cgi


Script Editorを開く

スクリーンショット 2015-10-04 19.33.02.jpg


Spreadsheet IDを調べる

さっき作ったSpreadsheetのIDを調べます。

どこからか調べる方法があるのかもしれないんですがよくわからなかったので、こんな感じでログに出力してもらいました。

function test() {

Logger.log(SpreadsheetApp.getActiveSpreadsheet().getId());
}

上記Scriptを実行するとIDが出力されているのでそれを次のステップで使用します。

IDが分かり次第上記Scriptは消しても構いません。

※ちなみにログエディタを開くにはcommandを押しながらenterです。


Scriptを書く

function doGet(e) {

var sheetName = e.parameter.sheetName;
var sheet = SpreadsheetApp.openById('さっき調べたID');
if (sheet.getSheets().some(function(s) {
return s.getSheetName() === sheetName;
})) {
var json = sheet.getSheetByName(sheetName).getRange('A:A').getValues()
.filter(function(value) {
return value[0] !== '';
})
.map(function(value) {
return value[0];
});
return ContentService
.createTextOutput(JSON.stringify(json))
.setMimeType(ContentService.MimeType.JSON);
}
}

doGet(e)はget通信の時に呼ばれる関数です。


公開する

UnityからこのSpreadsheetを参照できるようにしたいので、以下の設定を行います。

まずはバージョンの管理をします。

ここから…

スクリーンショット 2015-10-04 19.44.38.jpg

こうします。

※ちょっと余計なバージョンがありますが、テキストエリアに好きな文字入れて「新しいバージョンを保存」を押したらokです。

スクリーンショット 2015-10-04 19.45.28.jpg

その後ウェブアプリケーションとして導入します。

ここから…

スクリーンショット 2015-10-04 19.48.08.jpg

こうします。

スクリーンショット 2015-10-04 19.49.04.jpg

現在のウェブアプリケーションのURLはUnity側の設定で使います。

バージョンは先ほど管理したバージョンを選択してください。

アプリケーションにアクセスできるユーザーは「全員(匿名ユーザーを含む)」を選んでないと認証がどうのこうの言われます。

認証方法のやり方が分かればアプリケーションにアクセスできるユーザーを「全員」にした方がいいと思うのですが…

ごめんなさい( .. )_調べてないです。


unity側の用意


ScriptableObjectを作る

とりあえずこんなのを作りました。


Scenario.cs

using UnityEngine;

public class Scenario : ScriptableObject {
public string[] texts;
}



Assets下にEditorフォルダを作る


Editorでもコルーチンが使えるようにする

UnityEditorでコルーチンが使えないと難しいのでここからここのScriptをいただきました。

http://qiita.com/k_yanase/items/686fc3134c363ffc5239


MiniJSONを持ってくる

JSONの取り扱いが便利になるMiniJSONをこちらからいただきます。

これもEditorフォルダに入れました。

https://gist.github.com/darktable/1411710


Editorを作る

Editorフォルダ下に以下のScriptを作ります。

const string URLには、先ほど表示されたウェブアプリケーションのURLを入力してください。


ScenarioWriter.cs

using MiniJSON;

using UnityEditor;
using UnityEngine;
using System.Linq;
using System.Collections;
using System.Collections.Generic;

public class ScenarioWriter : EditorWindow {

const string URL = "ウェブアプリケーションのURL";
string _sheetName;
string _message;

[MenuItem("Window/Scenario Writer")]
static void Open() {
GetWindow<ScenarioWriter>();
}

void OnGUI() {
EditorGUILayout.Space();
_sheetName = EditorGUILayout.TextField(
"sheet name",
_sheetName,
GUILayout.Height(20.0f));
EditorGUILayout.Space();

if (GUILayout.Button("Create", GUILayout.Width(50.0f))) {
EditorCoroutine.Start(Run());
}

EditorGUILayout.Space();
EditorGUILayout.LabelField(_message);
}

IEnumerator Run() {
var download = new WWW(URL + "?sheetName=" + _sheetName);
_message = "download";
while (!download.isDone) {
_message += ".";
yield return new EditorCoroutine.WaitForSeconds(0.1f);
}

var json = (List<object>)Json.Deserialize(download.text);
if (json != null) {
var scenario = CreateScriptableObject<Scenario>("Assets/Scenarios/" + _sheetName + ".asset");
scenario.hideFlags = HideFlags.NotEditable;
scenario.texts = json.Select(j => j.ToString()).ToArray();
Debug.Log("complete.");
}
else {
Debug.LogError(download.text);
}
_message = "";
}

T CreateScriptableObject<T>(string output) where T : ScriptableObject {
var res = ScriptableObject.CreateInstance<T>();
AssetDatabase.CreateAsset((ScriptableObject)res, output);
return res;
}
}



完成

後はwindow/Scenario Writerを開いて、シート名を入れてCreateボタンを押すだけです。

デフォルトはAssets/Scenariosフォルダに出力されます。

スクリーンショット 2015-10-04 20.13.39.jpg


参考

以下のページから色々教えていただきました。ありがとうございました。

UnityEditor上でStartContinueっぽいのを動かす

http://qiita.com/k_yanase/items/686fc3134c363ffc5239

ほとんどここからパクりました。

http://daichan4649.hatenablog.jp/entry/2014/02/08/160453

ダミーデータはここからいただきました。

http://lipsum.sugutsukaeru.jp/index.cgi