【Unity】選択中のアセットのPathを取得【ディレクトリ】
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}");
}