我想为Unity 3D编辑器创建扩展程序并拥有自定义资源类型。在创建过程中,我认识到如果我可以通过右键单击指定要创建资产的路径,我将改进UX /可用性。但是我没有得到右键单击的上下文路径,我在谷歌或统一脚本api上找不到任何提示。下面你可以看到我试图在上面描述的过程的图像。
以下是负责处理上下文创建“事件”的代码。
[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");
}
如果您需要更多信息,请告诉我们。
答案 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.GetAssetPath
与Selection
一起使用永远不会返回一个文件夹,而是总是返回您单击的最后一个资产文件(检查器中显示的那个文件)。
这是我的尝试,扩展了@Владимир提出的使用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 相同的功能。它将在当前浏览器位置创建,提示重命名等。
如果您真的想使用自定义的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]);
隐藏在内部 unity ProjectWindowUtil.TryGetActiveFolderPath
静态函数中,需要反射器才能访问它。如果您是编码高手并且真的想拥有它,那么就在这里。 (非程序员,我就不解释了,请自行研究C#)
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 中测试。