作成した ScriptableObject をファイルパス指定ではなく
Assetフォルダ下のどこにあっても問題無いように検索して取得したい。
↓
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 右クリック Tools/Test で任意の場所に Test_ScriptableObject.asset ファイルを作成できる
[CreateAssetMenu(menuName = "Tools/Test")]
public class Test_ScriptableObject : ScriptableObject
{
public int value;
}
この Test_ScriptableObject.asset
を実際のコード上で取得する時
const string FilePath = "Assets/Test_ScriptabkeObject.asset";
public Test_ScriptableObject Load()
{
return AssetDatabase.LoadAssetAtPath<Test_ScriptableObject>(FilePath);
}
このように AssetDatabase.LoadAssetAtPath
を使用してScriptableObjectを取得できますが、 パスを指定しているのが気に食わない。
パスで決め打ちするよりファイルを検索した方が気持ちいい。
ということで、以下の形はどうでしょうか。
public Test_ScriptableObject Load()
{
var guid = AssetDatabase.FindAssets("t:" + nameof(Test_ScriptableObject)).FirstOrDefault();
var filePath = AssetDatabase.GUIDToAssetPath(guid);
if (string.IsNullOrEmpty(filePath))
{
// 場合により Exception や
throw new System.IO.FileNotFoundException("Test_ScriptableObject does not found");
// Log 出して return null
Debug.LogWarning("Oh...");
return null;
}
var test = AssetDatabase.LoadAssetAtPath<Test_ScriptableObject>(filePath);
return test;
}
AssetDatabase.FindAssets("t:" + nameof(Test_ScriptableObject))
t:オブジェクト名
で Assetフォルダ以下の指定オブジェクトをすべて取得。
今回はnameofでクラス名を取得。
すべて検索ということで、配列が返ってくるから FirstOrDefault()
で一番最初に見つかったものを取得しています。
しかしここは「複数見つかった場合ログを出す」ほうが親切ですね。
以上になります。
簡単ですが、UnityEditorの触りで自分が迷った箇所を書いてみました。
いつでも読み込めるように関数定義しておいた方が便利かも
void Hoge()
{
var instance = Load<Test_ScriptableObject>();
}
// 読み込みますよ
public T Load<T>() where T : UnityEngine.Object
{
var guid = AssetDatabase.FindAssets("t:" + typeof(T).Name).FirstOrDefault();
var filePath = AssetDatabase.GUIDToAssetPath(guid);
if (string.IsNullOrEmpty(filePath))
{
}
return AssetDatabase.LoadAssetAtPath<T>(filePath);
}