(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

ScriptableObjectの参照をちょっと楽にしてみる【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.3.4f1 Personal


はじめに

まずはじめに、ScriptableObjectとは以下のようなもので、

変化しないデータを利用する時に活躍するものです。

データを格納するオブジェクトです。もう少し言えば、Unityがデータをシリアライズ・デシリアライズしパラメータを格納するための仕組みです。

ゲーム内では静的なパラメータ置き場としたほうが良いかもしれません。


そのScriptableObjectを使う時は以下のようにInspectorから設定するか


f:id:kan_kikuchi:20160624132919j:plain


Resources.Loadを使って読み込みます。

MyScriptableObject myScriptableObject = Resources.Load<MyScriptableObject> ("MyScriptableObject");


上記のどちらの使い方でも基本的には問題ないのですが、

ちょっと参照しやすくなる方法があるので、今回はこれをご紹介!


Entity

その方法とは以下のように_entityとEntityを追加するだけです。

なお、分かりやすいようにScriptableObjectのクラスにEntityを作成していますが、

他のクラスに作成しても、もちろん大丈夫です。

using UnityEngine;
using System.Collections;

[CreateAssetMenu()]//Createメニューから作成できるようする属性
public class MyScriptableObject : ScriptableObject {

  //MyScriptableObjectが保存してある場所のパス
  public const string PATH = "MyScriptableObject";

  //MyScriptableObjectの実体
  private static MyScriptableObject _entity;
  public  static MyScriptableObject  Entity{
    get{
      //初アクセス時にロードする
      if(_entity == null){
        _entity = Resources.Load<MyScriptableObject>(PATH);

        //ロード出来なかった場合はエラーログを表示
        if(_entity == null){
          Debug.LogError(PATH + " not found");
        }
      }

      return _entity;
    }
  }

  //保存されているデータ
  public int IntData = 10;
}


上記の通り、Entityへの初アクセス時にResources.Loadをするため、

Inspectorで設定したり、あらかじめLoadする必要がなくなります。


また他のクラスからのアクセスも、いつでもできる&簡単になります。

int intdata = MyScriptableObject.Entity.IntData; 



おわりに

このやり方だと、エディタ実行中でなくとも簡単にデータにアクセスできるようになるので、

エディタ拡張でも重宝します。


また、今回はScriptableObjectの話でしたが、

public staticの変数に初アクセス時にprivate staticの変数を初期化する

というやり方は色々な所で使えますね。有名どころだとシングルトンのあたりとか(:3っ)∋〜