Unity Excelからのデータの取り込み

## 0.0 はじめに
Excel（エクセル）は数値データの取り扱いだけでなく、テーブル形式のデータを扱うのにとても便利なツールです。
ExcelのデータをUnityに取り込むことが出来れば、ゲームのデータ作りがはかどります。
Excelのデータの取り込み方法はいろいろありますが、簡単な方法を自分用に分かりやすくまとめました。
尚、こちらでは@mikitoさんの作られたExcel Importerを使わせていただいています。
本記事を書くために参考にした記事はこちら↓です。

https://qiita.com/mikito/items/2ad911f69180c15102a1














## 1.0 プラグインのインポート

[こちらにアクセスしてください。](https://github.com/mikito/unity-excel-importer "@mikitoさんのGitHub")
１.　右上のCodeと書かれたボタンをクリックします。
２.　Download ZIPを選んでダウンロードします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/aa012afd-ce45-3d7a-cfb2-9c8002ebd5b5.png)























ダウンロードしたZIPファイルの中にAssetsと書かれたフォルダがあります。その中にExcelImporterフォルダがありますのでZIPファイルから取り出してください。下図のように取り出したExcelImporterフォルダをUnityのProjectウインドウにあるAssetsフォルダに入れます。これでプラグインのインポートは完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/8bb04ca5-2241-a4fc-b94b-871b4e1be7a4.png)

















👍**ポイント**
ZIPファイルの中からそのままUnityへの追加はできません。デスクトップなど一度ZIPファイル外に保存してからUnityへ取り込みましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/9ae0224c-5be7-eece-9a04-824371686daa.png)














## 2.0 Excelのデータの作成
ではExcelでデータを作成しましょう。



##### 2.1 データ作成
パラメータは後から追加や変更が出来ますので最初は適当な物でもOKです。




##### 2.2 １行目はパラメータの名前
１行目はパラメータの名前でフィールド変数となります。半角の英語/ローマ字にしましょう。今後、Excelのパラメータを変更した場合はフィールド変数も併せて変更する必要があります。




##### 2.3 シート名
Excelのシート名はそのまま取り込まれテーブルのデータ名となります。同じく半角の英語/ローマ字にしておきましょう。





##### 2.4 ファイル名
Excelのファイル名は後で作成するScriptableObjectアセットファイルのクラス名となります。同じく半角の英語/ローマ字にしておきましょう。



👍**ポイント１**
ScriptableObjectとは直訳すると記述可能なオブジェクトで、このScriptableObjectを継承したクラスから作られたアセットを使いマスタデータや設定用のパラメータを持たせて、そのデータをいろいろなオブジェクトで共有できます。（個々のオブジェクトで似たようなデータを保持するよりもメモリも少なくて済みます。）

👍**ポイント２**
ScriptableObjectを継承したクラスにCreateAssetMenuアトリビュート[CreateAssetMenu]を付けると、ProjectウインドウのCreateからアセットを作ることができます。

👍**ポイント３**
[CreateAssetMenu(menuName = "MyGame/ExcelData")]のように記述することによりメニュー内に階層を作ったり、アセットメニューの名前が作れます。



##### 2.5 Excelファイルのインポート
出来上がったExcelファイルは保存してProjectウインドウにあるAssetsフォルダに入れましょう。（Assetsフォルダ以下であればどこでもよいです。下図では分かりやすいようにAssetsフォルダにExcelというフォルダを作りその中にExcelを入れています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/28df9afd-eb70-fafd-b37b-3a769895f23f.png)





















以下、作成したExcelデータです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/471891d7-c6e4-21b6-5b44-3925104cfaf4.png)

























![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/9125f0cb-8b47-d999-dd42-de1f14001d41.png)






















👍**ポイント**
空白の行または列がある場合はデータの終了とみなされて、それ以降の行または列に対して読み込みは行われません。
空白のセルのデータはデフォルト値として読み込まれます。
行の最初のセル（A列）にて最初の文字を#にするとその行すべてをコメント行とみなしてデータの読み込みは行われません。コメント行の次の行からは読み込みは行われます。







## 3.0 Entityクラスの作成
Excelファイルに作った複数のパラメータを1つにまとめて使うためにEntity(エンティテイー)と呼ばれるクラスを作ります。こちらは自分で手動で作る必要があります。パラメータを追加したり変更した場合はこちらのフィールド名もあわせて変更する必要があります。






```C#:MonsterDataEntity.cs
using UnityEngine;

[System.Serializable] // このアトリビュートの追加必要
public class MonsterDataEntity //  : MonoBehaviourは付けない
{   
    // publicでExcelデータの1行目と同じパラメータ
    public string monsterName;
    public int hp;
    public int mp;
    public int attack;
    public int defense;
}
```





👍**ポイント**
パラメータはpublicなフィールドで型と名前を定義します。
System.Serializableアトリビュートである[System.Serializable]を付与します。
 : MonoBehaviourは付けない





## 4.0 ExcelAssetスクリプトの生成
次にEntityクラスを保持するためのScriptableObjectクラスを生成します。

UnityにインポートしたExcelファイルを１．右クリック、２．Createを選び、３．ExcelAssetScriptを実行します。そうすると作成するスクリプトファイルの保存先が聞かれるため、適当なフォルダを選択します。





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/a4c38d05-3400-ed7e-a260-b6e87f5f3269.png)
















































## 5.0 ExcelAssetスクリプトの修正
先ほど選択したフォルダの中にExcelのファイル名と同じスクリプトが出来ていますのでダブルクリックで開きましょう。
下のような頭にExcelAssetアトリビュート、ScriptableObjectを継承したスクリプトが出来ています。
このスクリプトにはExcelデータのシート名から自動で作られたListの宣言がコメントアウトされています。今回はMonsterとCityと２つのシートがありますので２つ分出来ています。






```C#:ExcelData.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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





これを下記のように作成したEntityクラスの名前をもとに<>内を変更します。

```C#:ExcelData.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[ExcelAsset]
public class ExcelData : ScriptableObject
{
    public List<MonsterDataEntity> Monster;
    public List<CityDataEntity> City; 
}
```








## 6.0 ExcelデータのReimport（再インポート）
では、最後にExcelデータを再インポートしましょう。
（データを編集した場合も再インポートしましょう。）





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/fdada715-c556-e6b0-faf4-ee5ce11e9714.png)




































**下図のようにデータが出来上がっていれば成功です。**


👍**ポイント**
出来上がったファイルはScriptableObjectのアセットファイルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/451f5d4d-1394-3d49-cfce-c307c2bcd520.png)

















<br>
インスペクターを見るとこのようなデータが出来上がっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/f169aa04-a87d-8cb1-213f-b27f1aed1aad.png)











































## 7.0 データの使い方
データを利用するためには、MonoBehaviourを継承したクラスにSerializeFieldのフィールドを作ってExcelAssetオブジェクトをセットします。

```C#:Test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // Text（UI）を扱うのでこれが必要

public class TextTest : MonoBehaviour
{
    [SerializeField] private ExcelData excelData; // データを格納
    [SerializeField] private Text nameText; // 表示するモンスターの名前のテキスト

    private void Start() {
        // 表示のテキストをモンスターの名前（リストの1番はじめの）に変える
        nameText.text = excelData.Monster[0].monsterName;
    }
}

```










<br>
下のようにデータをセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/26720c0f-27c7-6b3c-c6dc-12f7fd6d506c.png)












<br>
下記のようにExcelデータかた読み込んだ情報を利用できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/bc88a43c-8be6-cb9c-bb3a-c481e39c4172.png)














## 8.0 おわりに
#### うまくいかない場合の確認用 (経験則)
### - Entityクラスには : MonoBehaviour をつけない
### - Entityクラスのパラメータはpublicとする
### - Excelデータをアップデートした際はReimportする