コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】ScriptableObject のクラス名を変更すると AssetDatabase.FindAssets( "t:XXXX" ) でヒットしなくなる

検証環境

  • Unity 2018.4.8f1

概要

リネーム前

using UnityEngine;

public class Example : ScriptableObject
{
}

例えば Example という名前の ScriptableObject のクラスを定義して
すでにアセットを作成している場合、

f:id:baba_s:20190927181050p:plain

Project ビューで「t:Example」形式で検索するとちゃんとヒットします

using System.Linq;
using UnityEditor;
using UnityEngine;

public static class Tools
{
    [MenuItem( "Tools/Hoge" )]
    private static void Hoge()
    {
        var guid = AssetDatabase
                   .FindAssets( "t:Example" )
                   .FirstOrDefault();

        var path    = AssetDatabase.GUIDToAssetPath( guid );
        var example = AssetDatabase.LoadAssetAtPath<Example>( path );

        Debug.Log( example != null ); // True
    }
}

AssetDatabase.FindAssets( "t:Example" ) でもちゃんとヒットします

リネーム後

using UnityEngine;

public class Example2 : ScriptableObject
{
}

この状態で Example クラスを Example2 にリネームして

f:id:baba_s:20190927181855p:plain

スクリプトファイルの名前も Example2 に変更して

f:id:baba_s:20190927181736p:plain

先ほど検索にヒットしたアセットが
リネーム後のスクリプトを正しく参照していることを確認します

f:id:baba_s:20190927182102g:plain

この状態で先ほどと同様に Project ビューで「t:Example2」で検索してみると
ヒットしなくなっていることが確認できます

AssetDatabase.FindAssets( "t:Example2" ) でもヒットしません
(正確にはヒットしますがメンバにアクセスしようとすると null 例外になります)

f:id:baba_s:20190927182513g:plain

新しく Example2 アセットを作成した場合は検索にヒットすることが確認できます

このように、ScriptableObject のクラス名を変更すると
すでに作成済みの ScriptableObject のアセットは
AssetDatabase.FindAssets( "t:XXXX" ) でヒットしなくなってしまうようです

対策

いくつか調べてみましたが、今のところ対策は見つかっていません
一応、アセットを作り直せばヒットするようになります