【Unity】アクティブなアセットのディレクトリを取得【ディレクトリ】

投稿者: | 2020年8月4日

はじめに

Asset を作成するときに 手こずったので覚書
コンテキストメニューから選択中の path を取得するものです。

右クリックから AssetDatabase.CreateAsset などの時に必要になるかも

サンプル

選択中のアセットのディレクトリの path を表示するサンプルです。
ディレクトリそのものが選択されている場合は、そのままディレクトリの path が表示されます。

非アセットの場合はメニューがグレーになり選択できません。

using UnityEngine;
using UnityEditor;

public class Test : ScriptableObject
{
	//----------------------------------------------------------------------------
	// 選択されてるか検証
	[MenuItem ("Assets/GetDirectory", true)]
	static public bool ValidateGetDirectory()
	{
		int instanceID = Selection.activeInstanceID;
		return instanceID != 0 && !string.IsNullOrEmpty( AssetDatabase.GetAssetPath( instanceID) );
	}
	//----------------------------------------------------------------------------
	// 選択されてるオブジェクトのパスを表示
	[MenuItem ("Assets/GetDirectory", false)]
	static private void GetDirectory()
	{
		// 選択中のアセットの path を取得
		string path = AssetDatabase.GetAssetPath( Selection.activeInstanceID);

		// ディレクトリですか?
		if( !System.IO.Directory.Exists( path ))
		{
			// ファイルなのでそのファイルのディレクトリを取得
			path = System.IO.Path.GetDirectoryName( path);
		}
		// ディレクトリを表示
		UnityEngine.Debug.Log( $"path={path}");
	}
} // class Test

アセットを選択しコンテキストメニューでGetDirectory を選択すると path が出ます。

Console に ディレクトリ が表示される

ディレクトリの場合はその path が表示される

アセット以外の場合は選択できない。

解説

まず、アセットかどうかを検証します。
未選択の場合は activeInstanceID=0
非アセットの場合は AssetDatabase.GetAssetPath で空文字が返ってくるので判定できます。

	[MenuItem ("Assets/GetDirectory", true)]
	static public bool ValidateGetDirectory()
	{
		int instanceID = Selection.activeInstanceID;
		return instanceID != 0 && !string.IsNullOrEmpty( AssetDatabase.GetAssetPath( instanceID) );
	}

メニュー選択後の処理になります。
AssetDatabase.GetAssetPath で path を取得後
System.IO.Directory.Exists でディレクトリかどうか調べ
ファイルなら System.IO.Path.GetDirectoryName でそのディレクトリで上書きしてます。

	//----------------------------------------------------------------------------
	// 選択されてるオブジェクトのパスを表示
	[MenuItem ("Assets/GetDirectory", false)]
	static private void GetDirectory()
	{
		// 選択中のアセットの path を取得
		string path = AssetDatabase.GetAssetPath( Selection.activeInstanceID);

		// ディレクトリですか?
		if( !System.IO.Directory.Exists( path ))
		{
			// ファイルなのでそのファイルのディレクトリを取得
			path = System.IO.Path.GetDirectoryName( path);
		}
		// ディレクトリを表示
		UnityEngine.Debug.Log( $"path={path}");
	}

コメントを残す