Unityで作成したスクリプトは、関連性のあるゲームオブジェクトに取り付けて何らかの処理を実行していました。
また、アイテムクラス等のデータを格納するクラスを作成する時はMonoBehaviourクラスを継承せず、Objectクラスを継承してデータクラスを作成してきました。
しかし、Unityでゲームオブジェクトに取り付けないクラスを使う時は、ScriptableObjectクラスを継承して作成すると非常に便利に扱う事が出来ます。
ScriptableObjectではないデータクラス用のクラスを、インスタンス化したプレハブ毎に持つとなるとその領域分のメモリを使用します。
ですがScriptableObjectの場合は参照値を確保するだけなので、メモリの節約にもなります。受け売り感満載・・・(^_^;)
そこら辺は
Unityのマニュアルに記載があります。
ScriptableObjectを継承したクラスの作成
ScriptableObjectを継承したクラスを作成してみます。
MyDataクラスをScriptableObjectクラスを継承した形で作成し、名前やHP、攻撃力を保存出来るデータクラスとします。
1 2 3 4 5 6 7 8 9 10 11 | using UnityEngine; using System.Collections; public class MyData : ScriptableObject { public string myName; public int hp; public float attackPower; } |
これでクラスが作成出来たので、インスタンス化してみます。
MyDataクラスはゲームオブジェクトに取り付ける事が出来ないので、ゲームオブジェクトに取り付けた他のスクリプトからMyDataクラスをインスタンス化します。
MainCameraにMakeMyDataという新しいスクリプトを作成し、取り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | using UnityEngine; using System.Collections; public class MakeMyData : MonoBehaviour { private MyData data; // Update is called once per frame void Update () { if (Input.GetButtonDown ("Fire1")) { data = ScriptableObject.CreateInstance <MyData> (); data.myName = "Name"; data.hp = Random.Range (10, 50); data.attackPower = 10f; Debug.Log (data.myName + " : " + data.hp + " : " + data.attackPower); } else if(Input.GetButtonDown("Fire2")) { Debug.Log (data.myName + " : " + data.hp + " : " + data.attackPower); } } } |
マウスの左ボタンを押したらMyDataクラスをインスタンス化しデータを入れます。
マウスの右ボタンを押したらデータだけをコンソールに出力しています。
ScriptableObjectクラスを継承したクラスは、通常のInstantiateを使ってインスタンス化を行うと警告が表示されるので、CreateInstanceを使用してインスタンス化します。
CreateAssetMenuアトリビュートを付ける
ScriptableObjectをスクリプト中でインスタンス化し、使う事が出来ました。
次はCreateAssetMenuアトリビュートをMyDataクラスに取り付け、エディターのメニュー項目からMyDataクラスのデータを作成し、ファイルとしてフォルダに作成してみます。
1 2 3 4 5 6 7 8 9 10 11 12 | using UnityEngine; using System.Collections; [CreateAssetMenu(fileName = "Data", menuName="Data")] public class MyData : ScriptableObject { public string myName; public int hp; public float attackPower; } |
CreateAssetMenuアトリビュートのfileNameはデフォルトのファイルの名前、menuNameはUnityのエディターメニューのCreateの中で表示される項目名です。
他にorder指定も出来、メニュー項目に表示される順番を変更する事が出来ます。
この辺りは
と同じだと思います。
それでは、エディターのメニュー項目でDataを選択してみましょう。
↑のように選択すると現在開いているフォルダに、Data.assetという名前のファイルが作成されます。
.assetという拡張子が付いたこのファイルはデータクラスとして使用する事が出来ます。
例えばシーン間の移動でデータを引き継ぎたい時は
の記事で紹介してますが、ScriptableObjectから派生して作成したファイルを使うと、もっと簡単にシーン間のデータの共有をする事が出来ます。
例えば、UseDataクラスを作成し、Dataファイルをpublicで指定出来るようにします。
1 2 3 4 5 6 7 8 9 | using UnityEngine; using System.Collections; public class UseData : MonoBehaviour { public MyData data; } |
他のスクリプトでも、publicでScriptableObjectクラスを継承して作ったMyDataを指定出来るようにしておけば、シーンを移動した後もData.assetから読みだす事が出来るので、難しい処理が必要なくなります。
ScriptableObjectを使ったシーン間のデータ共有については
↑を参照してください。