沐沐森的故事 2025-06-06 21:21 采纳率: 50%
浏览 8
已结题

UPM包内ICON资源加载

在Unity中,我开发了一个UPM包,这个包里面包含一些icon图片,现在我在这个包里面写了一个编辑器窗口用来展示这些ICON,我该如何加载到这些ICON资源?我不想用Resources.Load()加载,是否还有其他方法?

  • 写回答

7条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-06-06 21:23
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。

    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    UPM包内ICON资源加载方案

    在Unity UPM包中加载ICON资源,除了Resources.Load()外,还有以下几种推荐方法:

    1. 使用EditorGUIUtility.Load

    这是Unity编辑器专用的资源加载方式,特别适合加载编辑器资源如ICON:

    Texture2D icon = EditorGUIUtility.Load("Packages/com.your.package/Editor/Icons/your_icon.png") as Texture2D;
    

    2. 使用AssetDatabase.LoadAssetAtPath

    这是最推荐的方式,适用于编辑器脚本:

    using UnityEditor;
    using UnityEngine;
    
    
    Texture2D icon = AssetDatabase.LoadAssetAtPath<Texture2D>("Packages/com.your.package/Editor/Icons/your_icon.png");
    

    3. 使用Package相对路径

    可以获取包路径后组合路径:

    using UnityEditor;
    using UnityEngine;
    using System.IO;
    
    
    string packagePath = Path.GetFullPath("Packages/com.your.package");
    string iconPath = Path.Combine(packagePath, "Editor/Icons/your_icon.png");
    Texture2D icon = AssetDatabase.LoadAssetAtPath<Texture2D>(iconPath);
    

    4. 使用ScriptableObject存储引用

    创建一个ScriptableObject来存储所有ICON引用:

    using UnityEngine;
    using UnityEditor;
    
    
    [CreateAssetMenu(fileName = "IconDatabase", menuName = "Editor/Icon Database")]
    public class IconDatabase : ScriptableObject
    {
        public Texture2D[] icons;
    }
    
    
    // 使用时
    IconDatabase database = AssetDatabase.LoadAssetAtPath<IconDatabase>("Packages/com.your.package/Editor/IconDatabase.asset");
    Texture2D icon = database.icons[0];
    

    资源加载流程

    开始加载ICON

    最佳实践建议

    1. 将ICON资源放在Editor文件夹下,确保不会被打包到运行时
    2. 使用清晰的命名和目录结构,如Editor/Icons/
    3. 考虑使用常量或静态类管理资源路径
    4. 对于大量ICON,建议使用上述ScriptableObject方案
    public static class PackageResources
    {
        public const string IconPath = "Packages/com.your.package/Editor/Icons/";
        
        public static Texture2D LoadIcon(string name)
        {
            return AssetDatabase.LoadAssetAtPath<Texture2D>($"{IconPath}{name}.png");
        }
    }
    
    
    // 使用
    Texture2D icon = PackageResources.LoadIcon("your_icon");
    

    这些方法都比Resources.Load()更适合UPM包中的资源加载,且不会受到Resources系统限制。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 6月16日
  • 已采纳回答 6月8日
  • 创建了问题 6月6日