【Unity】「Unity Excel Importer Maker」を使ってExcelからScriptableObjectに変換する

Unity
マイケル
マイケル
みなさんこんにちは!
マイケルです!
エレキベア
エレキベア
こんにちクマ〜〜〜
マイケル
マイケル
今回は ExcelからScriptableObjectに変換するツール、
「Unity Excel Importer Maker」の使い方について紹介するよ!

tsubaki / Unity-Excel-Importer-Maker – GitHub

エレキベア
エレキベア
むむ、それは便利そうクマね〜〜〜
でも何でわざわざExcelファイルから作るクマ??
マイケル
マイケル
Unityでデータ管理して使う分にはScriptableObjectが相性がいいんだけど、
大量データの入力には向かないという欠点もあるんだ。
そこでExcel入力にして変換することでその欠点を軽減できるというわけさ!
エレキベア
エレキベア
なるほどクマ〜〜〜
Excel入力 x ScriptableObjectが強いわけクマね
マイケル
マイケル
ちなみにマスタデータを待たせるにあたって、どの形式に持たせた方がよいかについては
下記記事がすごく分かりやすいです!

【Unity】ScriptableObjectにマスタデータを持たせるメリットについて

マイケル
マイケル
また、ScriptableObjectの基本的な使い方については
下記記事で一度紹介していますので、こちらもよければご参照ください!
エレキベア
エレキベア
便利だから知っておいて損はないクマね〜〜〜

スポンサーリンク

Unity Excel Importer の使い方

マイケル
マイケル
というわけで早速使ってみよう!

基本的な使い方

unity packageのインポート
マイケル
マイケル
まずはGitHubに格納されているunitypackageをダウンロードして
Unityにインポートしましょう!

tsubaki / Unity-Excel-Importer-Maker – GitHub

エレキベア
エレキベア
同じみクマね
Excelでマスタデータを定義する
マイケル
マイケル
まずはExcelでマスタデータを定義しましょう!
今回は下記のようなモンスターのデータを定義してみます。
ScreenShot 2022 08 25 0 06 54↑マスタデータの定義
マイケル
マイケル
当初はxls形式のみ対応していたようですが、現在はxlsx形式にも対応しているようです。
なのでどちらかの形式で保存しておきましょう!
エレキベア
エレキベア
ExcelならDBレコードみたいに定義できるクマね
Unityにインポートして設定ファイルを作成する
マイケル
マイケル
そして次はUnityにExcelファイルをインポート後、
ファイルを右クリック -> XLS import Settings を選択します。
ScreenShot 2022 08 25 0 12 02↑XLS import Settingsを選択
マイケル
マイケル
すると下記のような設定画面が表示されるため、
取り込む項目と属性を確認してCreateを押下しましょう!
なお、この時のデフォルトのclass名は「Entity_Sheet名」となるようです。
ScreenShot 2022 08 25 0 13 03↑取り込む項目、属性を確認してCreate
エレキベア
エレキベア
ここで作成するScriptableObjectの設定を行うクマね
マイケル
マイケル
作成するとExcelファイルと同じ階層にScriptableObjectが作成されます。
確認してみると値も正常にインポートされていることが確認できました。
ScreenShot 2022 08 25 0 19 02↑同階層に作成される
ScreenShot 2022 08 25 0 19 21↑データも設定されている
マイケル
マイケル
作成されない場合は、Excelファイル右クリック -> Reimport
することで作成されると思います。
ScreenShot 2022 08 25 0 22 44↑Reimportすることで作成される
マイケル
マイケル
なお、ScriptableObjectのスクリプトは Assets/Terasurware/Classes フォルダ配下に作成されます。
ScreenShot 2022 08 25 0 19 35↑作成されたスクリプト
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Entity_Monsters : 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 double id;
		public string name_ja;
		public string name_en;
		public double hp;
		public double ap;
		public double dp;
		public double sp;
		public string png_name;
	}
}
マイケル
マイケル
構造はこのように、Sheetのリストの中に定義したパラメータのリストが格納される状態になるようです。
エレキベア
エレキベア
複数シートにまたいでデータを定義することもできるクマね
Scriptから操作する
マイケル
マイケル
スクリプトからは下記のように操作することができます。
データの持ち方さえ確認しておけば、普通のScriptableObjectの扱いと変わりありません。
    [SerializeField] private Entity_Monsters monsters;

・・・略・・・

    for (var i = 0; i < monsters.sheets.Count; i++)
    {
        for (var j = 0; j <  monsters.sheets[i].list.Count; j++)
        {
            var param = monsters.sheets[i].list[j];
            Debug.Log($"sheets: {i} param {j} id: {param.id} name: {param.name_ja}");
        }
    }
ScreenShot 2022 08 25 0 28 51↑データを出力してみた
エレキベア
エレキベア
気を付けるのはシートが挟まっていることくらいクマね

Repositoryクラスでの管理

マイケル
マイケル
また、下記のように別途Repositoryクラスを作って切り離して置くことで
参照が散らばることなく管理がしやすくなるためおすすめです。
using UnityEngine;
public class MonsterRepository : MonoBehaviour
{
    [SerializeField] private Entity_Monsters monsters;
    /// <summary>
    /// 指定IDのMonsterParamを返却
    /// </summary>
    public Entity_Monsters.Param GetMonsterParam(double id)
    {
        var param = monsters.sheets[0].list.Find(monster => monster.id == id);
        if (param == null) Debug.LogError("not found monster!! id: " + id);
        return param;
    }
}
↑Repositoryクラスで管理する
エレキベア
エレキベア
データの持ち方が変わった時にも備えて
アクセス用のクラスは分けておきたいところクマね

おわりに

マイケル
マイケル
というわけで今回作ったデータを使って作ったものがこちら!!
01 battle↑データを読み込んでバトルさせてみた
エレキベア
エレキベア
なんだこれクマ・・・
マイケル
マイケル
これは適当につくったやつだけど、
一度マスタデータ主体でゲームを作ってみるのも面白いかなと思っているよ!
マイケル
マイケル
それでは今日はこの辺で!!
アデューー!!!
エレキベア
エレキベア
クマ〜〜〜〜

【Unity】「Unity Excel Importer Maker」を使ってExcelからScriptableObjectに変換する 〜完〜

コメント