目前,我正在编写一个自定义的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'
答案 0 :(得分:2)
Unity中有两个内置的资产库:
如果使用的是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;
}
}