10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-07-08

0.0 はじめに

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

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

こちらにアクセスしてください。
1. 右上のCodeと書かれたボタンをクリックします。
2. Download ZIPを選んでダウンロードします。

image.png

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

image.png

👍ポイント
ZIPファイルの中からそのままUnityへの追加はできません。デスクトップなど一度ZIPファイル外に保存してからUnityへ取り込みましょう。
image.png

2.0 Excelのデータの作成

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

2.1 データ作成

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

2.2 1行目はパラメータの名前

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

2.3 シート名

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

2.4 ファイル名

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

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

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

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

2.5 Excelファイルのインポート

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

image.png

以下、作成したExcelデータです。
image.png

image.png

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

3.0 Entityクラスの作成

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

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ファイルを1.右クリック、2.Createを選び、3.ExcelAssetScriptを実行します。そうすると作成するスクリプトファイルの保存先が聞かれるため、適当なフォルダを選択します。

image.png

5.0 ExcelAssetスクリプトの修正

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

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クラスの名前をもとに<>内を変更します。

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

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

👍ポイント
出来上がったファイルはScriptableObjectのアセットファイルです。
image.png


インスペクターを見るとこのようなデータが出来上がっています。 ![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オブジェクトをセットします。

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;
    }
}


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

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?