【Unity】【エディタ拡張】Projectビューでアセットをダブルクリックした時の処理を書く

UnityのProjectビューでアセットをダブルクリックした時の処理を書く方法をまとめました。

Unity2019.4.0

やりたいこと

プロジェクトビューでアセットをダブルクリックするとPrefabだったらPrefabモードに入り、シーンだったら編集中のシーンが切り替わります。
本記事ではエディタ拡張でこのようにアセットをダブルクリックした時の処理を記述する方法をまとめます。

なおより正確には「ダブルクリックした時の処理」ではなく「アセットを開いた時の処理」になります。
(右クリックメニューからOpenしたときにもこの処理が走ります)

OnOpenAssetアトリビュート

ダブルクリックした時の処理を記述するにはOnOpenAssetアトリビュートを付けたstaticメソッドを定義します。

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;

public class OpenAssetCallbacks
{
    [OnOpenAsset(0)]
    public static bool OnOpen(int instanceID, int line)
    {
        var asset = EditorUtility.InstanceIDToObject(instanceID);

        Debug.Log(AssetDatabase.GetAssetPath(asset));
        return false;
    }
}

するとあるアセットが開かれる際にこのメソッドが呼ばれます。
上例では当該アセットのアセットパスをログ出力しています。

Prefabを開く際に確認するダイアログを開く

次に少し応用的な使い方として、Prefabを開く際に確認ダイアログを表示してみます。
確認ダイアログのYesボタンが押されたらPrefabを開き、Noボタンが押されたらキャンセルします。
このようにアセットを開くかどうかを自身で制御する場合には戻り値としてtrueを返します。

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;

public class OpenAssetCallbacks
{
    private static bool _isDialogOpen;
    
    [OnOpenAsset(0)]
    public static bool OnOpen(int instanceID, int line)
    {
        var asset = EditorUtility.InstanceIDToObject(instanceID);

        if (!(asset is GameObject))
        {
            // GameObject以外は普通に開く
            return false;
        }

        // 既にダイアログが開かれている状態ということは
        // 下記※1の処理により本メソッドが呼ばれていることになるので
        // そのままアセットを開く
        if (_isDialogOpen)
        {
            return false;
        }

        // Prefabを開くかどうか確認するダイアログを表示
        _isDialogOpen = true;
        if (EditorUtility.DisplayDialog("Confirmation", "Do you want to open the prefab?", "Yes", "No"))
        {
            // ※1
            AssetDatabase.OpenAsset(asset);
        }
        _isDialogOpen = false;
        
        // ダイアログを表示した場合には自分でアセットを開くかどうかを管理するためtrueを返す
        return true;
    }
}

細かい内容はコメントを参照してください。
これによりPrefabを開く際に確認ダイアログが表示されるようになりました。

f:id:halya_11:20200614222352g:plain
確認ダイアログ

参考

docs.unity3d.com

docs.unity3d.com