Googleスプレッドシートから情報を取得

作成するスクリプトは全部で5つ

データを読み込むだけなら2つ(GSSReader, GSSLoader)
インスペクターのカスタムボタンから読み込むために1つ(GSSReaderInspector)
スクリプタブルオブジェクトを保存するために1つ(SaveScriptable)
インスペクターのカスタムボタンからスクリプタブルオブジェクトの保存をするために1つ(GSSSaveInspector)

スプレッドシートは範囲外のセルはできるだけ消しておく

空のゲームオブジェクトを作成する

Googleスプレッドシート(以下GSS)を管理するオブジェクト
名前はなんでもいい(今回はGSSManager)

スクリプト「GSSReader」を作成する
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Events;

public class GSSReader : MonoBehaviour
{
  public string SheetID   = "1Mn5fuu-H_JJbTqOJdUaCB3K2KPYyXZjyjXI5oDoO9iQ";
  public string SheetName = "";
  public UnityEvent OnLoadEnd;
  public bool IsLoading { get; private set; }
  public string[][] Datas { get; private set; }
  IEnumerator GetFromWeb()
  {
    IsLoading = true;
    var tqx = "tqx=out:csv";
    var url = "https://docs.google.com/spreadsheets/d/" + SheetID + "/gviz/tq?" + tqx + "&sheet=" + SheetName;
    UnityWebRequest request = UnityWebRequest.Get(url);
    yield return request.SendWebRequest();
    IsLoading = false;
    var protocol_error   = request.result == UnityWebRequest.Result.ProtocolError   ? true : false;
    var connection_error = request.result == UnityWebRequest.Result.ConnectionError ? true : false;
    if (protocol_error || connection_error)
    {
      Debug.LogError(request.error);
    }
    else
    {
      Datas = ConvertCSVtoJaggedArray(request.downloadHandler.text);
      OnLoadEnd.Invoke();
    }
  }
  public void Reload() => StartCoroutine(GetFromWeb());
  static string[][] ConvertCSVtoJaggedArray(string t)
  {
    var reader = new StringReader(t);
    reader.ReadLine();  //ヘッダ読み飛ばし
    var rows = new List<string[]>();
    while (reader.Peek() >= 0)
    {
      var line = reader.ReadLine();        // 一行ずつ読み込み
      var elements = line.Split(',');    // 行のセルは,で区切られる
      for (var i = 0; i < elements.Length; i++)
      {
        elements[i] = elements[i].TrimStart('"').TrimEnd('"');
      }
      rows.Add(elements);
    }
    return rows.ToArray();
  }
}

読み込むための準備するスクリプト
中身はこのまま使う

スクリプト「GSSLoader」を作成する
using UnityEngine;

[RequireComponent(typeof(GSSReader))]
public class GSSLoader : MonoBehaviour
{
    public void OnGSSLoadWeapons(){
        var r = GetComponent<GSSReader>();
        var d = r.Datas;
        if (d != null){
            for (var row = 0; row < d.Length; row++){
                for (var col = 0; col < d[row].Length; col++){
                    Debug.Log("[" + row + "][" + col + "]=" + d[row][col]);
                    switch(col){
                        case 1: GM.Ins.weaponAry[row].ItmName = d[row][col]; break;
                        case 2: GM.Ins.weaponAry[row].ItmValue = int.Parse(d[row][col]); break;
                    }
                }
            }
        }
    }
}

読み込んだデータを変数に代入するスクリプト
読み込むデータは1行目は読み込まず2行目から読み込まれる
rowが行でcolが列

スクリプト「SaveScriptable」を作成する
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// using UnityEditor;

public class SaveScriptable : MonoBehaviour
{   
    public void SaveScriptableObject(){Debug.Log("スクリプタブルオブジェクト保存");
        for(int h = 0; h < GM.Ins.weaponAry.Length; h++){
            // EditorUtility.SetDirty(GM.Ins.weaponAry[h]);
        }
        // AssetDatabase.SaveAssets();
    }
}
スクリプト「GSSReaderInspector」を作成する(Editor)
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(GSSReader))]
public class GSSReaderInspector : Editor
{
    public override void OnInspectorGUI(){
        base.OnInspectorGUI();
        var r = target as GSSReader;
        var t = "スプレッドシート読み込み";

        EditorGUI.BeginDisabledGroup(r.IsLoading);

        if (GUILayout.Button(t))r.Reload();
        
        EditorGUI.EndDisabledGroup();
    }
}

インスペクターのカスタムボタンからデータロードを実行するためのスクリプト

スクリプト「GSSSaveInspector」を作成する(Editor)
using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(SaveScriptable))]
public class GSSSaveInspector : Editor
{
    public override void OnInspectorGUI(){
        base.OnInspectorGUI();
        var r = target as SaveScriptable;
        var t = "スクリプタブル保存";

        if (GUILayout.Button(t))r.SaveScriptableObject();
    }
}

インスペクターのカスタムボタンからスクリプタブルオブジェクトの保存するためのスクリプト

使い方

1、作成したGSSManagerに「GSSLoader」を追加(GSSReaderも一緒に追加される)

2、変数SheetIDにスプレッドシートのd/~~~/editの~~~の部分を入れる(長くて数字とアルファベットが入り混じってるやつ)

3、変数SheetNameにシートの名前を入れる(一応英語でやってる)

4、GSSLoaderのswitchの中身を適したものにする

5、GSSManagerに「SaveScriptable」を追加

6、SaveScriptableのコメントアウトした3箇所を解除する

7、EditorUtility.SetDirty(ここに保存したいスクリプタブルオブジェクトを入れる);

8、ゲームを実行しGSSReaderのボタン、SaveScriptableのボタンを順に押す

9、SaveScriptableの3箇所をコメントアウトする

– SaveScriptableでコメントアウトする理由 –
Editorのみのメソッドを使用するけど実行中に処理させたいため
UnityEngine.Editorがあるとオブジェクトに追加できない
UnityEngine.Editorがあるとビルドエラー
オブジェクトに追加した後ならUnityEngine.Editorを記述できる
とかそんな感じ

コメント

タイトルとURLをコピーしました