ScriptableObjectの読み込みを一元管理する
ScriptableObjectは便利ですよね。データをひとまとまりで取得できる優れものです。
今回はそれを読み込む流れを一元管理したいと思います。
読み込みが管理されていないと、どうなる?
クラスとScriptableObjectが「多対多」の関係になってしまい、人間の脳に優しくありません。
間に管理クラスを挟んで、「1対多」の関係を作る
管理クラス作成のために、ジェネリクスを使う
LoadData.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public sealed class LoadData
{
private static LoadData instance = new LoadData();
public static LoadData Instance
{
get
{
return instance;
}
}
// ScriptableObjectのみ受け付けるジェネリクスメソッド
public T ScriptableLoader<T>(string path) where T : ScriptableObject
{
return Resources.Load<T>(path);
}
}
こうすることで、ScriptableObjectが返されることを保証しつつ、様々な型のScriptableObjectを指定できます。
例
コード
今回使用したScrptableObjectです。
GameData.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "MyScript/Create GameData")]
public class GameData : ScriptableObject
{
public int Data1;
public string Data2;
public float Data3;
}
これをもとに、ScriptableObjectを作成し、値を入れます。
それをStart()で表示してみます。
Game.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Game : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log(LoadData.Instance.ScriptableLoader<GameData>("Data/MyGameData").Data1);
}
}
実行結果
おわりに
以上、「ScriptableObjectの型は使いたいクラスだけが知っていればいいよね。読み込むクラスはそんなの知らなくていいよ」という話でした。