気ままなUnityエンジニアブログ

新米Unityエンジニアが送る解説アウトプットブログです。Twitter : @UjinUnity

MENU

【Unity】GAS + スプレットシートで C#スクリプトを自動生成しよう! 【マスターデータに使える!】

スポンサーリンク

f:id:Wojtek:20191108004857j:plain


Unity基盤を作っているのですが、そろそろマスターデータ関連に着手したいと思いました。

初めはスプレットシートにマスターデータを作って、それをcsvファイルにして読み込もオーソドックスな仕組みを作ってましたが、

ふと、csvファイルと一緒にcsスクリプトも自動生成しちゃえば楽じゃない? ということに気づきました。

今回はGASを使ってGoogleドライブにcsファイルを自動生成する方法を解説します。


Googleドライブに専用のフォルダを作る


まずはGoogleドライブに生成したスクリプトファイルを保存するフォルダを作成します。

フォルダを作ったら、その中にスプレッドシートを作成しましょう。



スプレッドシートにマスターデータの値を記述する

次に作ったスプレッドシートの表をうめて行きます。

今回はマスターデータのスクリプトを自動生成するように作るため


・行にスクリプトで使う変数の名前
・2行にその変数の型名を記載します。
・3行 以降はその項目にあった値を記述します



f:id:Wojtek:20191108020205p:plain




今回は画像のような内容になります

ここまででスプレッドシートの順位が整いました。

次はスクリプトエディタの作成をしましょう


スクリプトエディタでファイルの自動生成を行おう

f:id:Wojtek:20191108144246p:plain


「ツール」→「スクリプトエディタ」からスクリプト作成に移ります。


スプレッドシートの値を取得する

function myFunction() {
  
  // スプレッドシートから値を取得する
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
}


まずは現在開いているスプレッドシートを取得しましょう。

SpreadsheetApp.getActiveSpreadsheet() でシート情報を取得できます。


シートから値をとる範囲を設定する

function myFunction() {
  
  // スプレッドシートから値を取得する
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  
  //現在のシートを取得
  var sheet = spreadsheet.getActiveSheet(); 
  // シートの最後の行数を取得
  var lastColume = sheet.getLastColumn();
  //3. 指定するセルの範囲(A1)を取得
  var range = sheet.getRange(1,1,2,lastColume);
  //4. 値を取得する
  var value = range.getValues();
}


spreadsheet.getActiveSheet() で 現在開いているシートを取得します。


sheet.getLastColumn(); で 何かが記載されているシートの最大数が取得できます。 


sheet.getRange() で取得する範囲を設定できます。

今回は 1行目の 変数名と 2行目の 変数の型 を取得したいので sheet.getRange(1,1,2,lastColume); という形になります。


csスクリプトのクラス名とusing を記述する

 // 選択中のシート名を取得する
  var sheetName = sheet.getSheetName();
  // 先頭文字を大文字にする
  var scriptName = sheetName.charAt(0).toUpperCase() + sheetName.slice(1);
  
  // 使用する using を設定する
  var scrpitUsings = "using UnityEngine;\n" + "using System;\n";
  
  // csスクリプトのclass生成用の文字列を設定する
  var scriptClassName = scrpitUsings + "\n" + "public class " + scriptName + " {";

sheet.getSheetName();  で現在のシート名を取得します。

マスターデータごとの名前をシートの名前にして、csスクリプトに連動する形式にしています。

そちらの方が分かりやすくで管理がとても楽になりますね。

sheetName.charAt(0).toUpperCase() + sheetName.slice(1);  では、 先頭文字を大文字にしています。

.slice() は 文字列の開始、終了位置を設定できます。

今回は 2文字目から表示される様に設定しています。


scrpitUsings では csファイルで使う using を文字列で設定しています。

ここは好きなusingを入れていただいて構いません。 ここを自動化しても面白そうですね。

最後の scriptClassName では csファイルの class 宣言文章を文字列で設定しています。


csスクリプトで使用する変数やメソッドの文字列を作成しよう!

  // プロパティ配列
  var propertyArray = [];

  // スプレットシートの値を代入する
  for(var i = 0 ; i < value.length ; i++)
  {
    // 変数orメソッド用の文字列を設定
    var property = "public" + " " + value[1][i] + " " + value[0][i] + ";";
    
 // 配列に追加
    propertyArray.push(property);
    // 改行する(任意)
    propertyArray.push("\n");
  }


propertyArray は csスクリプトの変数群を追加する配列です。


value.length は 先ほど取得した sheet.getRange() の内容が入っています。

二次元配列で構成されているのがポイントです ( dictionary 見たいになっています。)

// 変数orメソッド用の文字列を設定
    var property = "public" + " " + value[1][i] + " " + value[0][i] + ";";


ここが 変数orメソッドの生成箇所です。

今回は 変数 のみに対応しています。


public value[1][i] ( 変数の型 ) + value[0][i] (変数の名前) + ";" となっています。


これでスプレッドシートに記載した変数名と型を文字列としてスクリプトに設定することができる様になりました。


propertyArray.push(property) で作った文字列を配列に追加しています。


csスクリプトに記載する文字列を完成される

   // ,を消す
   var resultProperty = propertyArray.join("");
   
   // クラス内部の文字列を完成させる
   var scripts = scriptClassName + "\n" + resultProperty + "}";


propertyArray.join(""); で 配列内の , を消しています。


最後に classの文面を仕上げれば、クラス内部の設計は完成です。



ドライブにcsファイルを出力しよう!

   // 出力先のフォルダを設定する
   var myFolder = DriveApp.getFolderById('XXXXXXXXXXXXXXXXXXXXXXXXXX');
   // ファイルを出力する

   myFolder.createFile(scriptName + ".cs",scripts);

いよいよ先ほど作ったgoogleドライブにcsファイルを出力しましょう。

まず DriveApp.getFolderById で出力するフォルダを設定します。

XXXXX.... の部分はドライブフォルダDを入力してください。

フォルダのID は ドライブから任意のフォルダを開いた後のURLに乗っています。

drive/u/0/folders/XXXXXXXXXXXXXXXXXXXXXXXXXXX

のXXXX の部分です。


createFile(scriptName + ".cs",scripts); では ファイルを生成します。

scriptName + ".cs" では スクリプトの名前と拡張子を設定しています。

第2引数では scripts を設定しています。 

これでcsファイルの生成の準備が整いました。


ファイルを生成しよう!


それでは作ってきたGASスクリプトを起動しましょう。


f:id:Wojtek:20191108151201p:plain


左上の矢印ボタンを押して起動してください。

成功すれば 冒頭で作成したドライブに csファイルが生成されています。


f:id:Wojtek:20191108151253p:plain


csファイルもこのように出来上がりました。

using System;
using UnityEngine;

public class Temp {
    public int id { get; private set; }
    public string serihu { get; private set; }
    public float power { get; private set; }
}

いかがだったでしょうか。


今回の処理は様々な箇所で対応できると思うので、是非試してみてください!