読者です 読者をやめる 読者になる 読者になる

チリペヂィア

リンクフリー。サンプルコードなどは関連記事内でライセンスについて明示されない限り商用利用なども自由に行って構いませんが、自己責任でお願いします。またこれら日記内容の著作権自体は放棄していません。引用部分については引用元の権利に従ってください。

エディタ専用のリソースロード関数

AssetDatabase.LoadAssetAtPath()がResources.Load()と違って、プロジェクトのルートパスからの相対パスを完全に指定しなきゃいけないとなると、Editorフォルダに突っ込んで非ビルド用(≒エディタ専用)リソースにしようと思ったらEditorフォルダの親フォルダをちょっと動かしただけでも破綻しちゃうから困ったな。

正月早々しょうもないTipsを貼って遊びます。

Reources.Load()ではEditorフォルダにアクセスできないし、AssetDatabase.LoadAssetAtPath()は曖昧検索しません。つまり、"Editor/Sample.png"は"MyAsset/Editor/Sample.png"に引っ越す事が出来ません(いや、引越しのたびに文字列定数を書き換えれば別ですが、いくらなんでもアレすぎ)。ので、AssetDatabase版のあいまい検索を自作。

AssetDataBase使うのでEditorフォルダのスクリプトに書いてください。

使い方
// 第二引数は検索から除外したいフォルダ名だよ!
System.Collections.Generic.List<System.String> paths = AssetDatabaseFindPaths("アセット名とか/Editor/EditorOnlyTexture.png", "Resources");
Texture2D tex = AssetDatabase.LoadAssetAtPath(paths[0], typeof(Texture2D)) as Texture2D;
実装
using UnityEngine;
using UnityEditor;

public static System.Collections.Generic.List<System.String> AssetDatabaseFindPaths(System.String path, params System.String[] exclude_directories)
{
    if (exclude_directories == null) exclude_directories = new string[] {};
    System.Collections.Generic.List<System.String> ex_dirs = new System.Collections.Generic.List<string>(exclude_directories.Length);
    foreach (System.String exclude_directory in exclude_directories)
    {
        System.String ex_dir = exclude_directory.Replace(System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar);
        ex_dir = ex_dir.Trim(System.IO.Path.AltDirectorySeparatorChar);
        if (System.String.IsNullOrEmpty(ex_dir)) continue;
        ex_dirs.Add(System.IO.Path.AltDirectorySeparatorChar + ex_dir + System.IO.Path.AltDirectorySeparatorChar);
    }
    
    System.Collections.Generic.List<System.String> finds = new System.Collections.Generic.List<string>();
    if (0 < path.Length)
    {
        path = path.Replace(System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar);
        if (path[0] != System.IO.Path.AltDirectorySeparatorChar) path = System.IO.Path.AltDirectorySeparatorChar + path;

        System.String[] sources = AssetDatabase.GetAllAssetPaths();
        foreach (System.String src in sources)
        {
            System.String formatted_src = System.IO.Path.AltDirectorySeparatorChar + src.Replace(System.IO.Path.DirectorySeparatorChar, System.IO.Path.AltDirectorySeparatorChar);
            if (formatted_src.EndsWith(path, System.StringComparison.OrdinalIgnoreCase))
            {
                bool isExclude = false;
                foreach (System.String ex_dir in ex_dirs)
                {
                    if (isExclude = (-1 < src.IndexOf(ex_dir, System.StringComparison.OrdinalIgnoreCase))) break;
                }
                if (isExclude == false) finds.Add(src);
            }
        }

        // directory depth sort, and dictionary sort.
        finds.Sort((left, right) =>
        {
            int leftDepth = 0, rightDepth = 0;
            foreach (System.Char ch in left) if (ch == System.IO.Path.AltDirectorySeparatorChar) leftDepth++;
            foreach (System.Char ch in right) if (ch == System.IO.Path.AltDirectorySeparatorChar) rightDepth++;
            int ret = leftDepth.CompareTo(rightDepth);
            if (ret == 0) ret = System.String.Compare(left, right);
            return ret;
        });
    }

    return finds;
}

これでアセット名をつけたフォルダ配下のEditorフォルダに画像を置いて、エディタからロードできます。というかテクスチャのインポート設定にExcludeOnBuildフラグみたいなの欲しいです。今年もよろしくウマー。