見出し画像

【Unity】とりあえずScriptableObjectを知っておこう

忘れ物をして、不幸にも二日連続でスシローに行ったテトラさんです。スシが効く。
シトロンワールドというゲームを作っていて、たまに開発記事を書いたりしています。フォローして未来を目撃しましょう。

突然ですが皆さん、データの管理ってどうしてますか?

私の開発してるゲームは要素もりもり盛りだくさんの2DARPGなので、パラメータがたくさんあります。
例えばプレイヤーにはID、名前、キャラ情報、最大HP、移動速度、ダッシュ速度、ジャンプ力、回避距離などがあり、キャラを切り替える際、プレイヤーオブジェクトにそれぞれのデータを渡してやる必要があります。また、それぞれのステータスはパーティのステータスとして保持しておく必要があります。同じようなデータがたくさん必要になりますね。
そんな時にScriptableObjectが使えます。

ScriptableObjectとは?

ScriptableObject はシリアライズ可能な Unity 独自のクラスで、スクリプトインスタンスからは独立して大量の共有データを保存できます。ScriptableObject を使用すると、変更やデバッグの管理が容易になります。ゲーム内の各種システム間において、一定の水準で柔軟なコミュニケーションが簡単に確立されるようになるため、プロジェクト全体にわたるさまざまな事由における変更や採用に加えて、コンポーネントの再利用管理も簡単になります。

SCRIPTABLEOBJECT を使用してゲームを構築する 3 つの方法

カタカナが多くて大変ですが、ご安心ください。
ScriptableObjectで何ができるか、まずは簡単な例をお見せしましょう。

TestData.cs

まずはおもむろにこんな感じのスクリプトを書きます。

そしてプロジェクトで右クリック、"作成"にカーソル合わせると

[CreateAssetMenu]でメニューができます。
(menuName = "文字列")がメニュー名に。

いつものメニューの上になんか増えてるぞ!
迷わず作成して、適当な名前をつけましょう。

Testdata01としました

これがスクリプタブルオブジェクト。インスペクターには先ほど宣言したヤツが。

適当なスクリプトを組み、参照します。型は作成したクラス名、SerializeFieldして参照、ScriptableObjectであるTestdata01に適当な値を入れておきましょう。

値を入れよう

実行すると…

いちごミルクが出現しました。

こんな感じです。値を渡しながらも、Testdata01自体はどのオブジェクトとも紐づいていません。
つまり、アセットとしてデータを管理できます。

また、最初に作ったようにアセットメニューからじゃんじゃか作れるので、同じプロパティで値が違うデータをじゃんじゃか作ることが出来ます。
私は変数にUnityEventを仕込んだアイテムデータとかをじゃんじゃか作っています。たのしい。

また、同じオブジェクトをいくつもインスタンス化する際、共通のパラメータは同じScriptableObjectを参照することで宣言を無くし、メモリ使用量を削減することができます。

さらに、staticやDontDestroyOnLoad(非推奨!)を使わずにシーン間でデータを共有できるので、めんつゆめいた万能さです。

しかし、ビルド後は値を変更しても、セッション開始時にビルド時の値に初期化されてしまうため、セーブデータ的な使い方はできないようです。JSONでセーブしましょう。

かんたんな説明でしたが、なんとなくScriptableObjectとその使い方がわかってもらえたらと思います。

おまけ程度になりますが、listでデータベースを作ったり、それをExcelで一括管理したりもできます。(むしろこっちを紹介するべきだった…?)

ScriptableObjectは右側のCharaDataBaseクラス。要素は継承用クラスに記述。
Excel ImporterでデータベースをExcelから調整可能に。


それではこんな感じで。データベースについてはこれもさらに便利なので、改めて記事にしようと思います。

【追記】listのものだけになりますが、記事にしました。

フォロー、スキ!のエネルギーがシトロンに変換され、テトラさんのエネルギーになります。ぜひお願いします。

それでは、良き創作ライフを!

この記事が気に入ったらサポートをしてみませんか?