エクセルデータをUnityに読み込みたい [ Unity-Excel-Importer-Maker ]
なんと!それが可能な神ツールがございました♪
tsubakit1.hateblo.jp
ありがたく、使わせて頂きます。
ということで、使い方をメモ。
ダウンロードとインポート
入手先: GitHub - tsubaki/Unity-Excel-Importer-Maker
上記サイトからZipをダウンロードする。
解凍したら、TerasurwareフォルダをProjectにドラッグ&ドロップする。
エクセルファイルを用意する
MacだからエクセルじゃなくてNumbersとかいうやつなんだけど、こんな感じ。
sheet1
sheet2
ちなみに、何のデータかというと、
name(string) : 出撃するモンスターの名前
interval(float) : 出撃間隔
quantity(int) : 出撃数
シート名 : ステージ番号 _ ルート番号
注意点 : 余白行は含まないこと!
これはNumbersだけかもしれないけど・・・
行数をListのCountとして返すのだけど、空白行もカウントされるみたい。
なので、下記のように空白を含めて保存してしまうとCount=6になってしまうから注意。
間違い
↓
正しい
注意点 : 拡張子は.xlsにすること!
拡張子は、 .xls にすること。
.xlsxは対応されているようだが、エラーが出てダメだった。(私のやり方が間違っていたかもしれない)
.xlsmは、未対応。
注意点 : 複数シートはフォーマットを揃えること!
先頭行の列見出しが同じならば、複数シートを読み込むことができるらしい。
エクセルファイルをインポートする
手順1
ファイルが用意できたら、UnityのProjectにドラッグ&ドロップする。
場所はどこでもOK。
手順2
そのエクセルファイルを右クリックして、メニューから XLS Import Settings… を実行する。
手順3
設定画面が起動するので、設定してcreateを押す。
class name : これから作られるクラスファイルの名前になる。
sheet settings : 読み込みたいシートを enable にしておく。
Paramater settings : 列見出に対してデータ型を設定していく。わりと意図と違う場合があるのでチェックを忘れずに。
手順4
createを押したら、2つのファイルが生成されたかどうかを確認しておく。
_importerのほうは、これからやる.assetファイルを生成するためのクラス。
もう1つの方は、.assetファイルのデータを参照する時に使うクラス。
.assetファイルを生成する
.assetファイルがエクセルから読み込んだ実際のデータ入ったファイルになる。
エクセルファイルを右クリックして、Reimportをクリックすると生成される。
注意点:エラーは解消しておくこと!
コンソールにエラーが出てると失敗したりするので、エラーがある場合は修正しておくこと。
注意点:エクセルファイルは移動させないこと!
エクセルファイルは動かさないようがいいが、動かした場合は_importerのほうにパス設定できる箇所があるので、それを変更する。
public class MobList_importer : AssetPostprocessor { private static readonly string filePath = "Assets/ExcelData/MobList.xls"; //←ココ }
データを参照する方法
サンプルコード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PopMob : MonoBehaviour { private MobList mobList; [SerializeField]int stage; [SerializeField]int route; void Start () { mobList = Resources.Load ("MobList") as MobList; Debug.Log ("シートの総数 = " + mobList.sheets.Count); Debug.Log ("1枚目のシートの総数 = " + mobList.sheets [0].list.Count); Debug.Log ("1枚目のシートの名前=" + mobList.sheets [0].name); Debug.Log ("1枚目のシートの0番目 name=" + mobList.sheets [0].list [0].name); Debug.Log ("1枚目のシートの1番目 name=" + mobList.sheets [0].list [1].name); Debug.Log ("2枚目のシートの総数 = " + mobList.sheets [1].list.Count); Debug.Log ("2枚目のシートの名前=" + mobList.sheets [1].name); Debug.Log ("2枚目のシートの0番目 name=" + mobList.sheets [1].list [0].name); Debug.Log ("2枚目のシートの1番目 name=" + mobList.sheets [1].list [1].name); } }
出力結果
注意点:リソースから読み込むこと!
リソースから読み込んであるので、.assetファイルをResousesフォルダに移しておくこと。
リソースじゃなくてもインスペクターで設定する方法でもいいけど、エクセルファイルの修正などでファイルを生成し直す度にリンクが切れるので、ちょっと怖い。
で、移動させたので_importerのパスも変更しとく。
public class MobList_importer : AssetPostprocessor { private static readonly string filePath = "Assets/ExcelData/MobList.xls"; private static readonly string exportPath = "Assets/Resources/MobList.asset"; //←ココ }
生成されたクラスの構造
MobList mobList = Resources.Load ("MobList") as MobList;
(“MobList”)は、.assaetファイルへのパスになる。
それとは別に、MobListクラスというのは、エクセルファイルをインポートしたときに生成されたクラスのこと。
このクラスを見てみると、ScriptableObjectを継承してあり、クラスの中にクラスが2つある。
using UnityEngine; using System.Collections; using System.Collections.Generic; public class MobList : ScriptableObject { public List<Sheet> sheets = new List<Sheet> (); [System.SerializableAttribute] public class Sheet { public string name = string.Empty; public List<Param> list = new List<Param>(); } [System.SerializableAttribute] public class Param { public string name; public float interval; public int quantity; } }
public List<Sheet> sheets = new List<Sheet> ();
ここの
つまり、こんな感じになってる
参照方法
シートの枚数を知りたい場合
sheetsリストのCountを参照すればいいので
mobList.sheets.Count;
最初のシートの名前を知りたい場合
sheetリストの0番目にアクセスして、
public string name = string.Empty;
を参照する。
mobList.sheets [0].name;
最初のシート の 特定の列見出し の 最初の値 を知りたい場合
サンプルでいうところの “ant” を引き出す方法。
sheet[0]にアクセスしてから、listリストの0番目の見出しを参照する。
mobList.sheets [0].list [0].name
もうちょっとシンプルに
ファイルを丸ごと読み込んだので、ちょっと複雑になってるみたい。
ということで、次はシートごとに読み込む方法を取ってみる。
かなりシンプル。
続きはこちらの記事で↓
robamemo.hatenablog.com
以上。