Excelデータを使用したパラメーターテーブルの作成と読み込み【Unity】

はじめに

どうも。個人ゲーム開発者の弓猫です。

Unityでゲームを作っていると、パラメーターテーブルを作りたい時がままあります。

敵の体力や攻撃力といったステータスが、その最たる例でしょうか。

僕は今、「マインドロイド」というボードゲームを作っていますが、1つのユニットに「性別」「種族」「髪色」「装飾」という4つの属性を、計16個のユニットに与える必要がありました。

Scriptから手動で一つ一つに属性を設定してもいいんですが、面倒くさいですし変更が大変です。

できることなら、データの管理はExcel(.xlsx)で行ない、Scriptとデータテーブルを切り分けたいところです。

今回は、Excelでパラメーターテーブルを作成・管理し、Scriptから読み込んで値の受け渡しを行う方法を解説します。

Excelデータを用意する

Excelデータを作る

Excelデータが無いと始まりません。なんでもいいので、適当なデータテーブルを作成します。

今回は、敵のパラメータを設定するものとして、こんなファイルを用意してみました。

Excelデータのサンプルをダウンロード(Google Drive)

↑xlsxファイルのほうをダウンロードしてください。スプレッドシートのままではUnityで扱えません。

Excelデータを扱うために

Excelを持っていなくても、Excelデータ(.xlsx)の作成・編集はできます。

Googleスプレッドシートでもいいし、Windows・Mac・Linux用のソフトだとLibreOfficeが無料かつ使いやすいです。

Googleスプレッドシート

LibreOffice

Excelデータの規格

ちなみに、右にスクロールした説明にも書いてありますが、A列を文字列データにすると

UnityでScriptableObjectにした際に各項目が文字列で管理できて便利です。

こんな感じに。これをIDなどの数字にしてしまうと……

Element○○というデフォルト名の連番になってしまい、いちいち展開しないと中身が見えなくて面倒なことになります。

スポンサードサーチ

ScriptableObjectを使う

ExcelデータをUnityで扱える形式に

Excelファイルをそのまま使うことはできないので、ExcelファイルをScriptableObjectに変換するプラグインを導入します。

ScriptableObjectとは

詳しい説明は他の記事に譲ります。

簡単に言うと、

  • 敵の最大体力や攻撃力
  • ステージの開始座標
  • 制限時間の初期値

など、「静的なデータを扱うのに便利なUnityの機能」です。

Excelで設定した値が、Unity上でScriptableObjectとしてInspecter上で確認できます。一番上の行は項目名です。

Unity Excel Impoter Makerを使う

ExcelデータからScriptableObjectを作る「Unity Excel Impoter Master」というプラグインを使います。

これを使うと、初回のみ設定が必要ですが、以降はExcelでデータを更新すると自動でScriptableObjectに反映されます。

さっそくダウンロード……と行きたいのですが、実は作者が異なる「Unity Excel Impoter」という別バージョンがあります。

用途に応じて向き不向きがあるので、簡単に解説します。

Unity Excel Impoter Maker(テラシュールブログさん作)

  • 手間いらず
  • enum型が扱えない

enum型を使わない場合は、こちらをおすすめします。とにかく手間いらずで便利です。

ダウンロード

作者さんによる使い方の解説記事

Unity Excel Impoter(Mikito Yoshiyaさん作)

  • 若干、手間が多い(初回のみ)
  • enum型も扱える

いくつか手動でScriptを記述する必要があるので、手間もファイルの数も多くなりますが、

enum型を扱えるという大きな強みがあります。

「火・水・風」「剣・槍・弓」などの属性を扱う場合は、こちらがおすすめです。

ダウンロード

作者さんによる使い方の解説記事

詳しい使い方は、各々の作者さんたちが非常に分かりやすい解説記事を書いているので割愛しますが、

後者の場合は手動で用意しなければならないScriptがあるため、今回のMonsterParameter用のScriptファイルを用意しておきました。

これら2つをExcelファイルと同じディレクトリに入れて、Excelファイルを 右クリック>Reimport で設定完了です。

自分でオリジナルのExcelデータを使う際は、先述したQiitaの解説記事の手順に従って手動でScriptファイルを記述してください。

以降は何もせずとも、Excelファイルを保存するたびにScriptableObjectが更新されます(後者のUnity Excel Impoterを使い場合は、一度Excelを閉じないとエラーを吐きます)。

ScriptableObjectを扱う

ちゃんとScriptableObjectが作成されたか確認

まず、ちゃんと作れたのかを確認しましょう。ScriiptableObjectを選択し、Inspectorビューを見てみます。

サンプルを使用した場合、こうなっていればOKです。

Inspectorがグレーアウトしているのは、読み取り専用だからです。

ScriptableObjectは、たとえ値を書き込んでも実機環境だとゲーム終了時に値が初期化されるため、

基本的に読み取り専用で使うのが望ましいです。

パラメータテーブルを編集したい場合は、Excelファイルを開きましょう(リリース時には除外すること)

ScriptableObjectを読み込む

ScriptableObjectが作れたところで、いよいよこれを使ってゲームで実際に値を使ってみます。

と言っても、使い方は非常に簡単。ScriptableObjectを読み込んで、参照するだけです。

ScriptableObjectを読み込み、全要素をConsoleに出力するサンプルです。

param.Data[n]で任意のデータにアクセスします。

念のため言っておくと、DataはExcelデータの段階で設定したシートの名前です。

適当なGameObjectにアタッチし、Inspector上でParamにScriptableObjectをアタッチすれば動きます。

無事、各要素にアクセスできました。おめでとうございます。

余談

Inspector上のアタッチが面倒なら、各自ScriptableObjectの読み込みを

Resources.Loadや、Addressable Asset Systemに置き換えてください。

なお、ScriptableObjectで読み込んだ各種パラメータをフィールドとして保持し、getter / setterで渡すのは控えましょう。

メモリの無駄遣いで、苦労の意味がありません。

もし他のScriptへ値を渡したい場合は、param.Data[2] などのように、ScriptableObjectの要素の参照をそのまま渡せばOKです。

このためにも、ScriptableObjectは読み取り専用が望ましいですね。

まとめ

以上、備忘録も兼ねて、早足にまとめました。

Unityでパラメータテーブルを使いたくなる機会は多いものの、標準機能ではあまりサポートされていないため、有志が作ったプラグインに頼って上手に管理しましょう。