Roba Memo - 素人のUnity覚書と奮闘記

素人のUnity覚書と奮闘記

エクセルデータをUnityに読み込みたい [ Unity-Excel-Importer-Maker ]

なんと!それが可能な神ツールがございました♪
tsubakit1.hateblo.jp
ありがたく、使わせて頂きます。
ということで、使い方をメモ。

ダウンロードとインポート

入手先: GitHub - tsubaki/Unity-Excel-Importer-Maker

上記サイトからZipをダウンロードする。
f:id:nico-taniku:20170907195814p:plain:w300

解凍したら、TerasurwareフォルダをProjectにドラッグ&ドロップする。
f:id:nico-taniku:20170907200238p:plain:w300
f:id:nico-taniku:20170907200348p:plain:w200

エクセルファイルを用意する

MacだからエクセルじゃなくてNumbersとかいうやつなんだけど、こんな感じ。
sheet1
f:id:nico-taniku:20170908071004p:plain:w400

sheet2
f:id:nico-taniku:20170908071056p:plain:w400

ちなみに、何のデータかというと、
name(string) : 出撃するモンスターの名前
interval(float) : 出撃間隔
quantity(int) : 出撃数
シート名 : ステージ番号 _ ルート番号

注意点 : 余白行は含まないこと!

これはNumbersだけかもしれないけど・・・
行数をListのCountとして返すのだけど、空白行もカウントされるみたい。
なので、下記のように空白を含めて保存してしまうとCount=6になってしまうから注意。
間違い
f:id:nico-taniku:20170908071253p:plain:w400

正しい
f:id:nico-taniku:20170908071004p:plain:w400

注意点 : 拡張子は.xlsにすること!

拡張子は、 .xls にすること。
.xlsxは対応されているようだが、エラーが出てダメだった。(私のやり方が間違っていたかもしれない)
.xlsmは、未対応。

注意点 : 複数シートはフォーマットを揃えること!

先頭行の列見出しが同じならば、複数シートを読み込むことができるらしい。

エクセルファイルをインポートする

手順1
ファイルが用意できたら、UnityのProjectにドラッグ&ドロップする。
場所はどこでもOK。

手順2
そのエクセルファイルを右クリックして、メニューから XLS Import Settings… を実行する。
f:id:nico-taniku:20170908073238p:plain:w300

手順3
設定画面が起動するので、設定してcreateを押す。
f:id:nico-taniku:20170908074502p:plain:w400
class name : これから作られるクラスファイルの名前になる。
sheet settings : 読み込みたいシートを enable にしておく。
Paramater settings : 列見出に対してデータ型を設定していく。わりと意図と違う場合があるのでチェックを忘れずに。

手順4
createを押したら、2つのファイルが生成されたかどうかを確認しておく。
f:id:nico-taniku:20170908074442p:plain:w300
_importerのほうは、これからやる.assetファイルを生成するためのクラス。
もう1つの方は、.assetファイルのデータを参照する時に使うクラス。

.assetファイルを生成する

.assetファイルがエクセルから読み込んだ実際のデータ入ったファイルになる。
エクセルファイルを右クリックして、Reimportをクリックすると生成される。
f:id:nico-taniku:20170908080329p:plain:w300
f:id:nico-taniku:20170908080544p:plain:w200

注意点:エラーは解消しておくこと!

コンソールにエラーが出てると失敗したりするので、エラーがある場合は修正しておくこと。

注意点:エクセルファイルは移動させないこと!

エクセルファイルは動かさないようがいいが、動かした場合は_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);

    }
        
}

出力結果
f:id:nico-taniku:20170908081842p:plain:w300

注意点:リソースから読み込むこと!

リソースから読み込んであるので、.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クラスというのは、エクセルファイルをインポートしたときに生成されたクラスのこと。
f:id:nico-taniku:20170908074442p:plain:w200

このクラスを見てみると、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> ();
ここのは、その下にあるSheetクラスのことで、その中にあるは、さらにその下にあるParamクラスのことを指している。
f:id:nico-taniku:20170908085204p:plain:w600

つまり、こんな感じになってる
f:id:nico-taniku:20170908093534p:plain:w600

参照方法

シートの枚数を知りたい場合

sheetsリストのCountを参照すればいいので

mobList.sheets.Count;
最初のシートの名前を知りたい場合

sheetリストの0番目にアクセスして、
public string name = string.Empty;を参照する。

mobList.sheets [0].name;
最初のシート の 特定の列見出し の 最初の値 を知りたい場合

サンプルでいうところの “ant” を引き出す方法。
f:id:nico-taniku:20170908071004p:plain:w300
sheet[0]にアクセスしてから、listリストの0番目の見出しを参照する。

mobList.sheets [0].list [0].name

もうちょっとシンプルに

ファイルを丸ごと読み込んだので、ちょっと複雑になってるみたい。
ということで、次はシートごとに読み込む方法を取ってみる。
かなりシンプル。

続きはこちらの記事で↓
robamemo.hatenablog.com

以上。