Unity 获取 Project 文件夹选中文件路径

本文介绍了如何在Unity编辑器中通过脚本自定义Assets文件夹下右键菜单中的AssetsSelect按钮,实现选择文件或文件夹后打印其路径的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先需要在 Assets 文件夹下右键的弹出面板上添加一个按钮 AssetsSelect

当选中Assets 文件夹下的一个、多个 文件、或者文件夹,鼠标右键的弹出面板中点击 AssetsSelect ,将选中的文件或者文件夹路径打印出来

在 Editor 文件夹中新建脚本 AssetSelect.cs

using UnityEngine;
using UnityEditor;

public class AssetSelect 
{

    // 在 Assets 文件件下鼠标右键弹板中添加按钮 AssetsSelect
    [MenuItem("Assets/AssetsSelect")]
    static void Select()
    {
        // 获取所有选中 文件、文件夹的 GUID
        string[] guids = Selection.assetGUIDs;
        foreach(var guid in guids)
        {
            // 将 GUID 转换为 路径
            string assetPath = AssetDatabase.GUIDToAssetPath(guid);
            Debug.Log(assetPath);
        }
    }

    // 如果未选择任何文件、文件夹,则右键弹板中 AssetsSelect 按钮置灰不可用
    [MenuItem("Assets/AssetsSelect", true)]
    static bool IsSelect()
    {
        return null != Selection.assetGUIDs && Selection.assetGUIDs.Length > 0;
    }

}

获取路径为从 Assets/ 开始的路径

<think>我们被要求回答如何在Unity获取资源的GUID。根据引用内容,GUID是Unity中资源的全局唯一标识符。以下是几种获取资源GUID的方法:###方法1:在编辑器脚本中通过AssetDatabase获取Unity编辑器中,我们可以使用`AssetDatabase`类来获取资源的GUID。这适用于编辑器脚本(例如在`Editor`文件夹下的脚本)。```csharpusingUnityEditor;usingUnityEngine;publicclassGetGUIDExample:MonoBehaviour{//获取指定资源的GUIDpublicstaticstringGetGUIDForAsset(Objectasset){//获取资源路径stringpath=AssetDatabase.GetAssetPath(asset);//通过路径获取GUIDstringguid=AssetDatabase.AssetPathToGUID(path);returnguid;}//示例:获取选中资源的GUID[MenuItem("Tools/GetSelectedAssetGUID")]publicstaticvoidGetSelectedAssetGUID(){//获取选中的资源(在Project窗口)Object[]selectedAssets=Selection.GetFiltered(typeof(Object),SelectionMode.Assets);foreach(ObjectassetinselectedAssets){stringguid=GetGUIDForAsset(asset);Debug.Log($"Asset:{asset.name},GUID:{guid}");}}}```###方法2:通过资源路径获取GUID如果我们知道资源的路径(相对于Assets文件夹的路径),也可以直接获取GUID:```csharpstringpath="Assets/Textures/MyTexture.png";stringguid=AssetDatabase.AssetPathToGUID(path);```###方法3:在运行时获取GUID(仅适用于Addressables)在运行时,Unity通常不提供直接获取资源GUID的方法,因为GUID是编辑器概念。但是,如果使用Addressables系统,可以通过AddressableAssetEntry来获取GUID:```csharpusingUnityEngine.AddressableAssets;usingUnityEditor.AddressableAssets;usingUnityEditor.AddressableAssets.Settings;publicclassRuntimeGUIDExample{//注意:此方法仅在编辑器下可用,运行时不可用publicstringGetGUIDByAddressableAddress(stringaddress){AddressableAssetSettingssettings=AddressableAssetSettingsDefaultObject.Settings;AddressableAssetEntryentry=settings.FindAssetEntry(address);if(entry!=null){returnentry.guid;}returnstring.Empty;}}```###注意事项1.**编辑器限制**:`AssetDatabase`只能在编辑器下使用,不能在构建后的游戏中使用。2.**运行时替代方案**:在运行时,如果需要唯一标识资源,可以考虑使用Addressables的地址或标签,或者使用资源的名称和路径(但要注意唯一性)。3.**GUID的稳定性**:GUID是Unity管理资源的关键,如果资源被移动或重命名,GUID保持不变。但如果资源被重新导入,GUID可能会改变(通常不会)。4.**直接读取.meta文件**:在编辑器下,每个资源都有一个对应的.meta文件,其中包含GUID。但直接读取文件不推荐,应使用AssetDatabase。###示例:获取选中资源的GUID(扩展)根据引用[3],我们还可以通过`Selection.assetGUIDs`获取所有选中物体的GUID:```csharp[MenuItem("Tools/LogSelectedGUIDs")]publicstaticvoidLogSelectedGUIDs(){//获取选中的GUID(在Project窗口)string[]guids=Selection.assetGUIDs;foreach(stringguidinguids){//通过GUID获取路径stringpath=AssetDatabase.GUIDToAssetPath(guid);Debug.Log($"GUID:{guid},Path:{path}");}}```###总结-**编辑器下**:使用`AssetDatabase.AssetPathToGUID`或`Selection.assetGUIDs`。-**运行时**:无法直接获取GUID,但可以通过Addressables系统间接管理资源引用。>注意:在运行时修改资源引用通常不推荐,因为GUID与资源打包和寻址方式紧密相关[^1][^2]。§§相关问题§§1.Unity中如何通过GUID动态加载资源?2.Addressables系统如何管理资源?3.Unity资源管理的最佳实践有哪些?</think>在 Unity获取资源的 GUID(全局唯一标识符)有以下几种常用方法,根据使用场景可分为编辑器模式和运行时模式: ### 编辑器模式下获取 GUID(推荐) ```csharp using UnityEditor; using UnityEngine; public class GUIDGetter : MonoBehaviour { // 方法1:通过资源对象获取GUID public static string GetGUIDFromObject(Object asset) { if (asset == null) return string.Empty; string path = AssetDatabase.GetAssetPath(asset); return AssetDatabase.AssetPathToGUID(path); } // 方法2:通过资源路径获取GUID public static string GetGUIDFromPath(string assetPath) { return AssetDatabase.AssetPathToGUID(assetPath); } // 方法3:获取当前选中资源的GUID [MenuItem("Tools/Get Selected GUID")] public static void GetSelectedGUID() { foreach (string guid in Selection.assetGUIDs) { string path = AssetDatabase.GUIDToAssetPath(guid); Debug.Log($"GUID: {guid} | Path: {path}"); } } } ``` ### 运行时获取 GUID(有限支持) Unity 在运行时无法直接访问 GUID 系统,但可通过以下替代方案: ```csharp // 方案1:预先存储GUID到ScriptableObject [CreateAssetMenu] public class ResourceDatabase : ScriptableObject { public List<ResourceEntry> resources = new(); [System.Serializable] public class ResourceEntry { public string guid; public Object asset; } } // 方案2:使用Addressables系统(需要导入Addressables包) using UnityEngine.AddressableAssets; public class RuntimeReference : MonoBehaviour { public AssetReference assetRef; // 在Inspector中分配 void LoadAsset() { assetRef.LoadAssetAsync<GameObject>().Completed += handle => { GameObject obj = handle.Result; // 使用资源... }; } } ``` ### 关键 API 说明 1. **`AssetDatabase.GetAssetPath(Object asset)`** 获取资源在项目中的路径(如 "Assets/Textures/Icon.png") 2. **`AssetDatabase.AssetPathToGUID(string path)`** 将资源路径转换为 GUID(32位十六进制字符串) 3. **`Selection.assetGUIDs`** 获取编辑器选中资源的 GUID 数组[^3] 4. **`AssetDatabase.GUIDToAssetPath(string guid)`** 通过 GUID 反向获取资源路径[^2] ### 使用场景示例 ```mermaid graph TD A[选择资源] --> B[获取路径] B --> C[转换为GUID] C --> D[存储到数据库] D --> E[运行时通过标识符加载] ``` ### 注意事项 1. **编辑器限制**:`AssetDatabase` 仅能在 Unity 编辑器中使用,无法在构建后的应用中运行 2. **运行时方案**: - 预先生成 GUID-资源 映射表 - 使用 Addressables 系统替代直接 GUID 访问 - 使用资源名称/路径作为替代标识符(但需确保唯一性) 3. **GUID 特性**: - 资源移动/重命名时保持不变 - 重新导入资源时保持不变 - 删除资源后 GUID 会被回收 4. **跨项目兼容**:复制资源到新项目时会生成新 GUID > 提示:对于动态资源管理,建议结合 ScriptableObject 创建资源数据库,存储 GUID 和资源的关联关系[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值