2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ScriptableObject をパス指定ではなく検索して取得する。

Last updated at Posted at 2020-03-01

作成した 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);
	}
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?