Unityでのデータの扱い方
はじめに
初めまして。団体長のTZと申します。一応コーディング課、DTM課ですが今年はあまりサークル内で制作やれてなかったり……。
団体長は毎年25日に書くのが恒例らしいのでとりあえず枠だけ取ってみたものの、あまりネタが思いつかなかったので別のとこで書いたものを再掲します。
今回はゲーム制作サークルであるRiGで大半のコーディング課が使用しているゲーム制作エンジン、Unityについての話です。
議題:データを扱いたい
RPGなどでは沢山のデータを扱うことと思います。最近RPG?を作ったのですが、エネミーのステータス、使うスキル、プレイヤーが扱うスキル、アイテム、それらを表す文字列や数値や画像…。どう扱えばええんじゃいという感じです。ということで、Unityでこれらのデータを扱う方法を見ていきます。
データの扱い方
①ハードコーディング
サクサク行きます。やめましょう。
ハードコーディングというのは、スクリプトにデータとなる数値などをそのまま書くことですが、これはデータの数スクリプトが必要になります。
スライムスクリプト、データ部分 int attack = 5…ってのが何個もある。えぐい。見にくい、変更がめんどくさい、無駄にスクリプトが増える
②SerializeField
これはさっきとあんまり変わりません。Unityでは変数にSerializeField属性をつけることでprivate変数でもInspecterから操作できるんですが、これ自体は便利です。下手にInspecterから操作したいからpublic変数~とかするよりはよほどいいです。が、データを扱うのには向いてないかなと思います。構造的に前のハードコーディングと同じような、データの数だけスクリプトがあるって感じになると無駄ですし、じゃあ配列で管理すればいいというわけでもありません。文字列、数値、画像など多様で多くのデータを一挙に一つのデータとして扱いたい場合、SerializeFieldではきついものがあります。
③CSV,JSONなどをシリアライズ
いい感じの人はこれを使っている印象があります。
UnityはCSV,JSON,TXTなどいろんなファイルがTextAssetとして読み込めるので、読み込んで使うらしいです。(昔音楽ゲームの譜面データをtxtで作って読み込んだことがありましたが、単純な構成なのにだいぶ苦労したことがあって私は再チャレンジできてません…)
これのいいところは、CSVなどで扱うことで同じデータタイプのデータ(たとえばエネミーデータ一覧、アイテムデータ一覧)を一挙に見れることだと思います。また、マスターデータがUnityから切り分けられることで、アプリ配信をした際などにマスターデータの配信だけしたいのに
いちいちアプリの審査をする、なんてことをしなくてよくなります。サーバーにマスターデータを置いて、随時DLさせる方針にすればいいかららしいです。私はやったことはありません。(データをサーバーに置いといてとか高度なことできたことないので)
④ScriptableObject
今回採用したものです。Unity公式のデータ管理機能?的なもので、データのベースとなるスクリプトを定義すると後は数値だけ違うけど同じ型
というデータが何個も作れて参照できます。中身はYAML形式というもので書かれているらしいですがあまり意識することはないです。
Enum形式がドロップダウンで選べる、画像なども入れられるEnemyDataという名前でエネミーのデータタイプを作っておけば中身がなんであろうとEnemyDataとして扱えるので差し替えも楽ちんといいことだらけ。作るのがちょいめんどくさい(後輩曰く日が暮れる)のがちょっと難点かもしれません。
例:EnemyData ベースとなるスクリプト部分
例:生成したEnemyData
展望
ScriptableObject、いちいちエディタで打ってるとすっごい時間かかりますし管理的にもCSVで書いて適用できた方が便利なんですよね……。Enumの扱いとか難しいですけど将来的にCSVをScriptableに流し込みたい。
ということで今年のアドベントカレンダーはこれで終了となります。お読みくださった皆さん、今日までアドカレを書いてくださったサークルの皆さん、お疲れ様でした!