在Unity 3D编辑器中获得右键单击的路径

时间:2015-08-31 19:12:22

标签: c# unity3d

我想为Unity 3D编辑器创建扩展程序并拥有自定义资源类型。在创建过程中,我认识到如果我可以通过右键单击指定要创建资产的路径,我将改进UX /可用性。但是我没有得到右键单击的上下文路径,我在谷歌或统一脚本api上找不到任何提示。下面你可以看到我试图在上面描述的过程的图像。

Asset creation process

以下是负责处理上下文创建“事件”的代码。

[MenuItem("Assets/Create/Chat")]
public static void createChatViaMenu() {
    Chat c = Chatter.createDefaultChat();

    // This is the part where I want to insert the relative path.
    AssetDatabase.CreateAsset(c, "Assets/" + c.Title + ".asset");
}

如果您需要更多信息,请告诉我们。

4 个答案:

答案 0 :(得分:3)

解决方案可以在Hash Buoy的this回答中找到。

我需要的核心信息是我可以通过AssetDatabase.GetAssetPath (Selection.activeObject)获得相对路径。

答案 1 :(得分:1)

    [UnityEditor.MenuItem("Assets/Create/Get Current Path")]
    static void GetCurrentPath(UnityEditor.MenuCommand menuCommand)
    {
        foreach(var g in UnityEditor.Selection.assetGUIDs)
            UnityEngine.Debug.Log(UnityEditor.AssetDatabase.GUIDToAssetPath(g));
    }

在这种情况下,GUID将包含一个元素。 Debug.Log显示调用下拉菜单的当前路径。

示例:资产/场景等

还需要检查资产是否已分配。

示例:资产/场景/Main.scene

答案 2 :(得分:0)

AFAIK,将AssetDatabase.GetAssetPathSelection一起使用永远不会返回一个文件夹,而是总是返回您单击的最后一个资产文件(检查器中显示的那个文件)。

这是我的尝试,扩展了@Владимир提出的使用assetGUIDs的建议,以防万一您需要完整路径(但很容易对其进行修改以返回相对路径):

    private static string GetClickedDirFullPath()
    {
        string clickedAssetGuid = Selection.assetGUIDs[0];
        string clickedPath      = AssetDatabase.GUIDToAssetPath(clickedAssetGuid);
        string clickedPathFull  = Path.Combine(Directory.GetCurrentDirectory(), clickedPath);

        FileAttributes attr = File.GetAttributes(clickedPathFull);
        return attr.HasFlag(FileAttributes.Directory) ? clickedPathFull : Path.GetDirectoryName(clickedPathFull);
    }

答案 3 :(得分:0)

使用内置属性

如果您的资产很简单,不需要特殊处理,您应该使用内置属性来生成“创建资产”菜单。

[CreateAssetMenu( menuName = "Wappen Asset/WaveBankData" )]
public class WaveBankData : ScriptableObject
{

它会神奇地添加到右键菜单 -> 创建。具有与 Unity 相同的功能。它将在当前浏览器位置创建,提示重命名等。

enter image description here


通过菜单项回调

如果您真的想使用自定义的MenuItem。以下是 TextMesh pro 确定当前右键单击文件夹的方式。如果您在 MenuItem 回调下调用 Selection.assetGUIDs,它将保证当前显示文件夹(您在其空白处点击的那个)

有关完整脚本,请参阅您自己的 \Packages\com.unity.textmeshpro\Scripts\Editor\TMP_ColorGradientAssetMenu.cs

    [MenuItem("Assets/Create/TextMeshPro/Color Gradient", false, 115)]
    public static void CreateColorGradient(MenuCommand context)
    {
        string filePath;

        if (Selection.assetGUIDs.Length == 0)
            filePath = "Assets/New TMP Color Gradient.asset";
        else
            filePath = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]);

(奖励)TRUE 项目浏览器当前目录

隐藏在内部 unity ProjectWindowUtil.TryGetActiveFolderPath 静态函数中,需要反射器才能访问它。如果您是编码高手并且真的想拥有它,那么就在这里。 (非程序员,我就不解释了,请自行研究C#)

enter image description here

using UnityEngine;
using UnityEditor;
using System.Reflection;

    // Define this function somewhere in your editor class to make a shortcut to said hidden function
    private static bool TryGetActiveFolderPath( out string path )
    {
        var _tryGetActiveFolderPath = typeof(ProjectWindowUtil).GetMethod( "TryGetActiveFolderPath", BindingFlags.Static | BindingFlags.NonPublic );

        object[] args = new object[] { null };
        bool found = (bool)_tryGetActiveFolderPath.Invoke( null, args );
        path = (string)args[0];

        return found;
    }

注意:在 Unity 2019.4.19f 中测试。

Also cross-posted with gamedev.stackexchange