Как узнать путь и размер файла встроенных ресурсов Unity? - PullRequest
2 голосов
/ 16 мая 2019

Фон

В настоящее время я пишу пользовательский плагин редактора Unity, который позволяет пользователям загружать выбранный файл изображения в конечную точку API REST в облаке для обработки (например, добавляя преобразования, оптимизации и т. Д.).

Также отображается набор деталей до и после выбранного изображения (например, перед шириной / высотой / размером изображения по сравнению с шириной / высотой / размером изображения)

Пользователь выбирает нужное изображениечерез следующий фрагмент кода

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 Ответ

2 голосов
/ 16 мая 2019

В Unity есть две встроенные библиотеки ресурсов:

  1. Встроенная библиотека в «Ресурсах / unity_builtin_extra»: содержит спрайт UGUI 、 Материал по умолчанию 、 Шейдер и т. Д.
  2. Встроенная библиотека в разделе «Библиотека / ресурсы по умолчанию для единства»: содержит встроенную трехмерную сетку и ресурсы 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...