Unity備忘録35頁目「ScriptableObjectでデータ管理1」

江上宿六です。

 

今回はキャラの制御ではなくてデータ管理系をやります。 唐突です。

理由として唐突にそういった記事を目にして後々使えそうだと思ったからです。

自身の理解も追いついてないので適当な記事になるかもしれませんが。

 

さて、データ管理でScriptableObjectというのを使ってみる事にしたわけですけど

これがどういうものなのかというと、それについて書かれたものを色々読んだ結果

変動しない共有データをアセットとして生成して運用できるものという感じですか。

 

なんだか今一つ分かりにくい感じですが、例えばアイテムにアイテム名や攻撃力

説明文などがあるとして、そういったデータをオブジェクト毎に持たせていたら

ちょっとメモリ的に優しくないので、そういうのを解消できたりするようです。

 

正直言うとメモリについて考えた事は無いんですけども、そこを抜きにしても

データを管理するのに役立つと思ったので記しておこうと思ったのです。

早速やっていく事にしましょうか。

まずはプロジェクトにスクリプトを追加します。 今回はアイテムデータを作る

という感じで進めるのでItemDataと名付け、開いて編集します。

f:id:y6yegami:20190629184000p:plain

 5行目の[SerializeField]は後述するとして、6行目のCreateAssetMenuですが

こう記述する事でメニューバーのAssetsからこのクラスの情報を持った

オブジェクトを生成する事が出来るようになります。

 

そして8行目のクラスの宣言部分が通常と少し違います。 今まではクラス名の後は

MonoBehaviourとなっていたのですが、そこがScriptableObjectになっています。

まぁ、単にScriptableObjectの機能を使うという認識で良いと思います。

それとこのスクリプトはオブジェクトにアタッチして使うわけではないので

Start()とUpdate()は消してしまって良いでしょう。

f:id:y6yegami:20190629193650p:plain

ItemData内はこんな感じになりました。 enumは列挙型です。

ItemTypeとして素材、食べられる物、装備品を定義しておきました。

 

続いて変数を宣言していくのですが、また[SerializeField]が出てきました。

この[SerializeField]なんですが、このように記述して変数の宣言をする事で

インスペクター上で値を確認したり操作することが出来るようになるのです。

 

だったらpublicで宣言すれば良いのではという話もよくあるらしいのですが

インスペクター上でいじれたりするだけで、一応private変数のままなので、

まぁ、そういうのを意識する場合は[SerializeField]を使うと良いと思います。

f:id:y6yegami:20190629200636p:plain

その後はこのように値を取得出来るような関数が宣言されています。

保存したらUnity側に戻りましょう。

f:id:y6yegami:20190629201109p:plain

メニューバーのAssets→Createの所にCreateItemDataというのが出来ています。

これが最初の方でやったCreateAssetMenuの効果です。 早速選択してみましょう。

f:id:y6yegami:20190629201418p:plain

先ほど作ったItemDataの要素を持つオブジェクトが生成されました。

ItemTypeの所を選択するとちゃんと素材、食べられる物、装備品が選べます。

f:id:y6yegami:20190629202208p:plain

設定例です、適当です。

 

こうやって1つデータが出来ましたが、この設定したデータを参照する為には

シーン上のオブジェクトにアタッチする必要があります。 とはいえこれを生成する

アイテムのオブジェクトにそれぞれアタッチしてたら本末転倒なので、それらを

管理する空のオブジェクトにアタッチする事になります。 スクリプトも忘れずに。

f:id:y6yegami:20190702133741p:plain

f:id:y6yegami:20190702133923p:plain

こんな感じです。

 

データを持つオブジェクトを生成したり参照したりする事が出来ましたが

この状態だとまだ管理面で若干の難があるので、次回はそこに手を入れてみます。