MRが楽しい

MRやVRについて学習したことを書き残す

AssetDatabaseを使ってアセットフォルダ内のプロファイルをスクリプトから参照する

本日は Unity の小ネタ枠です。
AssetDatabaseを使ってアセットフォルダ内のプロファイルをスクリプトから参照する方法についてです。

AssetDatabaseを使ってプロファイルを参照する

UnityEditor.AssetDatabase を使ってアセットデータベース にアクセスできます。
アセットデータベースにはアセット内のソースファイルをアプリで使用できる形式に変換したファイルとそれらに関連するデータが保持されています。
docs.unity3d.com

サンプルスクリプト

以下にサンプルスクリプトと検索対象のスクリプタブルオブジェクトを作成しました。
アセット内にあるスクリプタブルオブジェクトのプロファイルを検索してそのデータをデバッグログに表示しています。
・FindAssetDataBaseTest.cs

using System.Linq;
using Sandbox.AssetDataBase.Scripts;
using UnityEngine;

public class FindAssetDataBaseTest : MonoBehaviour
{
    void Start()
    {
#if UNITY_EDITOR
        // プロジェクト内のアセットから指定の型のプロファイルを検索する
        var guids = UnityEditor.AssetDatabase.FindAssets($"t:{nameof(AssetDataBaseProfile)}").FirstOrDefault();
        if (string.IsNullOrEmpty(guids))
        {
            Debug.Log("Not Found AssetDataBaseProfile");
            return;
        }
        
        // GUIDからパスを取得してプロファイルの情報を取得する
        var path = UnityEditor.AssetDatabase.GUIDToAssetPath(guids);
        var profile = UnityEditor.AssetDatabase.LoadAssetAtPath<AssetDataBaseProfile>(path);
        if (profile != null)
        {
            // プロファイル内のプロファイル名のデータを表示する
            Debug.Log($"AssetDataBaseProfile is {profile.ProfileName}");
            return;
        }
#endif
    }
}

・AssetDataBaseProfile.cs

using UnityEngine;

namespace Sandbox.AssetDataBase.Scripts
{
    [CreateAssetMenu(fileName = "TestAssetDataBaseProfile", menuName = "AssetDataBase/AssetDataBaseProfile")]
    public class AssetDataBaseProfile : ScriptableObject
    {
        [Tooltip("プロファイル名"), SerializeField]
        private string profileName;
        public string ProfileName => profileName;
    }
}

動作確認

以下のサンプルスクリプトを設定したシーンを作成しました。
プロジェクトのアセット内にプロファイルを作成して、データを入力します。

シーンを再生すると以下の通りアセット内のプロファイルを検索してデータを参照できました。

アセット内に対象の型のプロファイルがない場合は GUID が取得できず、データは参照できません。