【Unity】とりあえずScriptableObjectを知っておこう
忘れ物をして、不幸にも二日連続でスシローに行ったテトラさんです。スシが効く。
シトロンワールドというゲームを作っていて、たまに開発記事を書いたりしています。フォローして未来を目撃しましょう。
突然ですが皆さん、データの管理ってどうしてますか?
私の開発してるゲームは要素もりもり盛りだくさんの2DARPGなので、パラメータがたくさんあります。
例えばプレイヤーにはID、名前、キャラ情報、最大HP、移動速度、ダッシュ速度、ジャンプ力、回避距離などがあり、キャラを切り替える際、プレイヤーオブジェクトにそれぞれのデータを渡してやる必要があります。また、それぞれのステータスはパーティのステータスとして保持しておく必要があります。同じようなデータがたくさん必要になりますね。
そんな時にScriptableObjectが使えます。
ScriptableObjectとは?
カタカナが多くて大変ですが、ご安心ください。
ScriptableObjectで何ができるか、まずは簡単な例をお見せしましょう。
まずはおもむろにこんな感じのスクリプトを書きます。
そしてプロジェクトで右クリック、"作成"にカーソル合わせると
いつものメニューの上になんか増えてるぞ!
迷わず作成して、適当な名前をつけましょう。
これがスクリプタブルオブジェクト。インスペクターには先ほど宣言したヤツが。
適当なスクリプトを組み、参照します。型は作成したクラス名、SerializeFieldして参照、ScriptableObjectであるTestdata01に適当な値を入れておきましょう。
実行すると…
こんな感じです。値を渡しながらも、Testdata01自体はどのオブジェクトとも紐づいていません。
つまり、アセットとしてデータを管理できます。
また、最初に作ったようにアセットメニューからじゃんじゃか作れるので、同じプロパティで値が違うデータをじゃんじゃか作ることが出来ます。
私は変数にUnityEventを仕込んだアイテムデータとかをじゃんじゃか作っています。たのしい。
また、同じオブジェクトをいくつもインスタンス化する際、共通のパラメータは同じScriptableObjectを参照することで宣言を無くし、メモリ使用量を削減することができます。
さらに、staticやDontDestroyOnLoad(非推奨!)を使わずにシーン間でデータを共有できるので、めんつゆめいた万能さです。
しかし、ビルド後は値を変更しても、セッション開始時にビルド時の値に初期化されてしまうため、セーブデータ的な使い方はできないようです。JSONでセーブしましょう。
かんたんな説明でしたが、なんとなくScriptableObjectとその使い方がわかってもらえたらと思います。
おまけ程度になりますが、listでデータベースを作ったり、それをExcelで一括管理したりもできます。(むしろこっちを紹介するべきだった…?)
それではこんな感じで。データベースについてはこれもさらに便利なので、改めて記事にしようと思います。
【追記】listのものだけになりますが、記事にしました。
フォロー、スキ!のエネルギーがシトロンに変換され、テトラさんのエネルギーになります。ぜひお願いします。
それでは、良き創作ライフを!
この記事が気に入ったらサポートをしてみませんか?