マスターデータ等、Unityでテーブル形式のデータを扱う際はExcelを使うと便利なことがよくあります。その際は一般的にNPOIを利用して読み込みを行うのですが、データに合わせて毎回インポート処理を実装するのが手間でした。そこで、今回その仕組みを汎用化しプラグインにしてみました。

ちなみに、UnityでExcelを読み込むためのプラグインで有名なものに、テラシュールブログ・@tsubaki様(いつもお世話になっております)のUnity Excel Importer Makerがありますが、こちらはImporterを「Make」するためのプラグインです。本プラグインはImporter部分はリフレクションを用いて1つのまま、Excel内のデータを保持するScriptableObjectを作るという点で違いがあります。

プラグインインポート

https://github.com/mikito/unity-excel-importer
こちらのリポジトリからソースコードをダウンロードし、
Assets/ExcelImporter以下をプロジェクトに追加してください。

Excelファイルごとの事前準備

Excelファイルごとに、
それに紐づく必要なクラスの定義・生成を一度だけ行う必要があります。

1. Entityクラスの定義

まずは、Excelからロードしたいデータ構造のクラスを手動で定義します。
本プラグインではこのデータ構造クラスをEntityクラスと呼んでいます。
クラスにはpublicなフィールドで型と名前を定義し、
System.Serializableアトリビュートを付与します。

MstItemEntity.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class MstItemEntity
{
    public int id;
    public string name;
    public int price; 
}

2. Excelファイルの作成と追加

次に、Excelファイルを作成します。
Excelファイルは1行目にEntityクラスのフィールド名を記述し、
そのフィールドの型に基づく値を2行目から入力します。
さらにシートの名前を適当な名称に変更します。

34470078-7246b924-ef6d-11e7-8711-acb49ae2c349.png

作成したExcelファイルをAssets以下のどこのディレクトリでも良いので、
Unityにインポートします。
この時1度だけワーニングが出ますが、無視して構いません。

34470091-8bdc1c76-ef6d-11e7-88e5-76c76294a26c.png

3. ExcelAssetスクリプトの生成

次にEntityクラスを保持するためのScriptableObjectクラスを生成します。
こちらは総じてExcelAssetクラスと呼んでいます。
Excelファイルを選択した状態で
ProjectビューのCreateメニューからExcelAssetScriptを実行すると、
スクリプトファイルの保存先が聞かれるため、適当なディレクトリを選択します。

34470096-abdadd0a-ef6d-11e7-9bf6-e9458c660264.png

すると、Excelファイルと同名のテンプレートスクリプトが生成されます。
生成されたスクリプト内には、コメントアウトされた行があり、
Excelファイル内のシート数と名前が反映されています。

MstItems.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExcelAsset]
public class MstItems : ScriptableObject
{
    //public List<EntityType> Entities; // Replace 'EntityType' to an actual type that is serializable.
}

ちなみに、ExcelAssetスクリプトの生成はプラグインの機能を利用すると楽ですが、
大した内容ではないので手動で定義しても問題ありません。
(ExcelAssetアトリビュートが付いたScriptableObjectで、Excelファイルと同名である必要があります。)

4. ExcelAssetスクリプトの修正

上記で生成したスクリプトを修正します。
コメントアウトを外し、EntityTypeを実際のTypeに置き換えます。

MstItems.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExcelAsset]
public class MstItems : ScriptableObject
{
    public List<MstItemEntity> Entities;
}

自動更新とデータの利用

一度上記作業を終えた後は、
Excelファイルを更新する度に自動で対応するExcelAssetのScriptableObjectを生成・更新します。

初回設定時はExcelファイルに対してReimportを行うと即時処理が実行され良いでしょう。

34470102-cde2bcc4-ef6d-11e7-8083-a661b82ae707.png

このデータを利用するためには、
何かしらのMonoBehaviourクラスのSerializeFieldのフィールドからExcelAssetオブジェクトを参照してください。

その他

コメント行

行の先頭のセルにて最初の文字を#にするとその行をコメント行とみなします。

アセット生成パスの変更

ExcelAssetアトリビュートにAssetPathを指定すると、
Excelファイルと同じディレクトリに生成されるAssetファイルのパスを変更できます。
例えば、Resources以下に変更すれば、
Resources.Load使って参照を取るということも可能です。

MstItems.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExcelAsset(AssetPath = "Resources/MasterData")]
public class MstItems : ScriptableObject
{
    public List<MstItemEntity> Entities;
}

Enumの利用

Entityクラス内のフィールドの型にenumを指定し、
Excelファイルのセル内にそのenumの要素名を文字列で入力すると、
自動でenumに変換します。

このとき、Excelファイル内で「データの入力規則」の機能を使って
enum名のプルダウンを作ると便利です。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.