如何获取Unity内置资产的路径和文件大小?

时间:2019-05-16 00:59:44

标签: unity3d

背景

目前,我正在编写一个自定义的Unity编辑器插件,该插件可让用户将选定的图像文件上传到云端中待处理的REST API端点(例如,添加转换,优化等)。

它还会显示所选图像的一系列前后细节(例如,图像宽度/高度/尺寸之前与图像宽度/高度/尺寸之后)

用户通过以下代码选择所需的图像

selected_texture = (Texture2D) EditorGUI.ObjectField(drawing_rect, selected_texture, typeof(Texture2D), false);

选择之后,我就可以通过获取相应的文件大小

file_size = new FileInfo(AssetDatabase.GetAssetPath(selected_texture)).Length;

问题

这适用于大多数选定的纹理,但是当我选择内置的Unity纹理时,会出现以下错误。

FileNotFoundException: Could not find file 'Resources/unity_builtin_extra'

1 个答案:

答案 0 :(得分:2)

Unity中有两个内置的资产库:

  1. “资源/ unity_builtin_extra”中的“内置库”:包含UGUI sprite,Default-Material,Shader等。
  2. “图书馆/社区默认资源”中的“内置图书馆”:包含内置的3D网格和OnGUI资产。

如果使用的是AssetDatabase.GetAssetPath,则始终会在上面获得一个或另一个路径。

要解决此问题,您需要执行以下代码:

public const string BuiltinResources = "Resources/unity_builtin_extra";
public const string BuiltinExtraResources = "Library/unity default resources";

public static bool IsBuiltInAsset(string assetPath)
{
    return assetPath.Equals(BuiltinResources) || assetPath.Equals(BuiltinExtraResources);
}

public static long GetTextureFileLength(Texture texture)
{
    string texturePath = AssetDatabase.GetAssetPath(texture);
    if (IsBuiltInAsset(texturePath))
    {
        /*
            * You can get all built-in assets by this way.
            * 
        var allAssets = AssetDatabase.LoadAllAssetsAtPath(BuiltinResources);
        var allExtraAssets = AssetDatabase.LoadAllAssetsAtPath(BuiltinExtraResources);
        */

        // not supportted
        // return -1;

        // using MemorySize
        return Profiler.GetRuntimeMemorySizeLong(texture);
    }
    else
    {
        return new FileInfo(texturePath).Length;
    }
}