ゲーム開発
Unity
UnrealEngine
C++
Blender
ゲーム数学
ゲームAI
グラフィックス
サウンド
アニメーション
GBDK
制作日記
IT関連
ツール開発
フロントエンド関連
サーバサイド関連
WordPress関連
ソフトウェア設計
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
ラーメン日記
四コマ漫画
その他
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • Blender
    • ゲーム数学
    • ゲームAI
    • グラフィックス
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • IT関連
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • WordPress関連
    • ソフトウェア設計
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • ラーメン日記
    • 四コマ漫画
      • その他
        • おすすめアイテム
        • おもしろコラム
      1. ホーム
      2. 20220825_01

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

      UnityScriptableObject
      2022-08-25

      マイケル
      マイケル
      みなさんこんにちは!
      マイケルです!
      エレキベア
      エレキベア
      こんにちクマ〜〜〜
      マイケル
      マイケル
      今回は 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でマスタデータを定義しましょう!
      今回は下記のようなモンスターのデータを定義してみます。
      ↑マスタデータの定義
      マイケル
      マイケル
      当初はxls形式のみ対応していたようですが、現在はxlsx形式にも対応しているようです。
      なのでどちらかの形式で保存しておきましょう!
      エレキベア
      エレキベア
      ExcelならDBレコードみたいに定義できるクマね
      Unityにインポートして設定ファイルを作成する
      マイケル
      マイケル
      そして次はUnityにExcelファイルをインポート後、
      ファイルを右クリック -> XLS import Settings を選択します。
      ↑XLS import Settingsを選択
      マイケル
      マイケル
      すると下記のような設定画面が表示されるため、
      取り込む項目と属性を確認してCreateを押下しましょう!
      なお、この時のデフォルトのclass名は「Entity_Sheet名」となるようです。
      ↑取り込む項目、属性を確認してCreate
      エレキベア
      エレキベア
      ここで作成するScriptableObjectの設定を行うクマね
      マイケル
      マイケル
      作成するとExcelファイルと同じ階層にScriptableObjectが作成されます。
      確認してみると値も正常にインポートされていることが確認できました。
      ↑同階層に作成される
      ↑データも設定されている
      マイケル
      マイケル
      作成されない場合は、Excelファイル右クリック -> Reimport
      することで作成されると思います。
      ↑Reimportすることで作成される
      マイケル
      マイケル
      なお、ScriptableObjectのスクリプトは Assets/Terasurware/Classes フォルダ配下に作成されます。
      ↑作成されたスクリプト
      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}");
              }
          }
      
      ↑データを出力してみた
      エレキベア
      エレキベア
      気を付けるのはシートが挟まっていることくらいクマね

      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クラスで管理する
      エレキベア
      エレキベア
      データの持ち方が変わった時にも備えて
      アクセス用のクラスは分けておきたいところクマね

      おわりに

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

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


      UnityScriptableObject
      2022-08-25

      関連記事
      【Unity】Timeline × Excelでスライドショーを効率よく制作する
      2024-10-31
      【Unity】Boidsアルゴリズムを用いて魚の群集シミュレーションを実装する
      2024-05-28
      【Unity】GoでのランキングAPI実装とVPSへのデプロイ方法についてまとめる【Go言語】
      2024-04-14
      【Unity】第二回 Wwiseを使用したサウンド制御 〜インタラクティブミュージック編〜
      2024-03-30
      【Unity】第一回 Wwiseを使用したサウンド制御 〜基本動作編〜
      2024-03-30
      【Unity】第二回 CRI ADXを使用したサウンド制御 〜インタラクティブミュージック編〜
      2024-03-28
      【Unity】第一回 CRI ADXを使用したサウンド制御 〜基本動作、周波数解析編〜
      2024-03-28
      【Unity】サウンドミドルウェアに依存しない設計を考える【CRI ADX・Wwise】
      2024-03-27