UnityのScriptableObjectを使う

記事内に広告が含まれています。

Unityで作成したスクリプトは、関連性のあるゲームオブジェクトに取り付けて何らかの処理を実行していました。

また、アイテムクラス等のデータを格納するクラスを作成する時はMonoBehaviourクラスを継承せず、Objectクラスを継承してデータクラスを作成してきました。

しかし、Unityでゲームオブジェクトに取り付けないクラスを使う時は、ScriptableObjectクラスを継承して作成すると非常に便利に扱う事が出来ます。

ScriptableObjectではないデータクラス用のクラスを、インスタンス化したプレハブ毎に持つとなるとその領域分のメモリを使用します。

ですがScriptableObjectの場合は参照値を確保するだけなので、メモリの節約にもなります。受け売り感満載・・・(^_^;)

そこら辺は

ScriptableObject - Unity マニュアル
ScriptableObject は、クラスのインスタンスとは独立した大量のデータを保存するためのデータコンテナです。ScriptableObject の主な使用例の 1 つに、値のコピーを避けてプロジェクトのメモリ使用量を減らすことがあり...

Unityのマニュアルに記載があります。

スポンサーリンク

ScriptableObjectを継承したクラスの作成

ScriptableObjectを継承したクラスを作成してみます。

MyDataクラスをScriptableObjectクラスを継承した形で作成し、名前やHP、攻撃力を保存出来るデータクラスとします。

これでクラスが作成出来たので、インスタンス化してみます。

MyDataクラスはゲームオブジェクトに取り付ける事が出来ないので、ゲームオブジェクトに取り付けた他のスクリプトからMyDataクラスをインスタンス化します。

MainCameraにMakeMyDataという新しいスクリプトを作成し、取り付けます。

マウスの左ボタンを押したらMyDataクラスをインスタンス化しデータを入れます。

マウスの右ボタンを押したらデータだけをコンソールに出力しています。

ScriptableObjectクラスを継承したクラスは、通常のInstantiateを使ってインスタンス化を行うと警告が表示されるので、CreateInstanceを使用してインスタンス化します。

ScriptableObjectをスクリプトからインスタンス化

CreateAssetMenuアトリビュートを付ける

ScriptableObjectをスクリプト中でインスタンス化し、使う事が出来ました。

次はCreateAssetMenuアトリビュートをMyDataクラスに取り付け、エディターのメニュー項目からMyDataクラスのデータを作成し、ファイルとしてフォルダに作成してみます。

CreateAssetMenuアトリビュートのfileNameはデフォルトのファイルの名前、menuNameはUnityのエディターメニューのCreateの中で表示される項目名です。

他にorder指定も出来、メニュー項目に表示される順番を変更する事が出来ます。

この辺りは

UnityのEditorを拡張して自前のメニュー項目を表示する
UnityのEditorを拡張して自前のメニュー項目を表示し、項目を選択した時に処理を実行してみます。

と同じだと思います。

それでは、エディターのメニュー項目でDataを選択してみましょう。

エディタのメニュー項目からScriptableObjectをファイル化

↑のように選択すると現在開いているフォルダに、Data.assetという名前のファイルが作成されます。

.assetという拡張子が付いたこのファイルはデータクラスとして使用する事が出来ます。

例えばシーン間の移動でデータを引き継ぎたい時は

Unityでシーンを移動した時のデータやゲームオブジェクトの引き継ぎ
Unityのゲームで別のシーンに移動した時に前のシーンで使っていたゲームオブジェクトやデータを今のシーンで使う方法を考えていきます

の記事で紹介してますが、ScriptableObjectから派生して作成したファイルを使うと、もっと簡単にシーン間のデータの共有をする事が出来ます。

例えば、UseDataクラスを作成し、Dataファイルをpublicで指定出来るようにします。

他のスクリプトでも、publicでScriptableObjectクラスを継承して作ったMyDataを指定出来るようにしておけば、シーンを移動した後もData.assetから読みだす事が出来るので、難しい処理が必要なくなります。

ScriptableObjectを使ったシーン間のデータ共有については

UnityのScriptableObjectを使ったシーン間のデータ共有
UnityのScriptableObjectを使ってシーンを移動した時にデータを共有出来るようにします。

↑を参照してください。

参考サイト

UnityマニュアルーScriptableObjectー

UnityライブトレーニングーIntroduction to Scriptable Objectsー

タイトルとURLをコピーしました