Unity 6.3
0 онлайн 3 гостей 3 в системе
Вход

Программирование с помощью базы данных ассетов

AssetDatabase класс содержит методы, позволяющие обращаться к ассетам и выполнять с ними операции так же, как это делает Unity Editor. Вы можете создавать, импортировать, удалять, копировать, перемещать, загружать и сохранять ассеты, а также искать в базе данных ассетов.

Это означает, что вы можете создать все от простых настроек до мощных инструментов и настроек для рабочего процесса ассетов вашего проекта, используя Unity Скриптинг в редакторе и Настройка окон редактора.

Полный перечень имеющихся методов и документация по каждому методу приведены в справочнике AssetDatabase API.

Пакетные операции AssetDatabase

Вы можете использовать пакетную обработку, чтобы сэкономить время при внесении изменений в ассеты из кода. Если вы вносите изменения в несколько ассетов, поведение по умолчанию базы данных ассетов заключается в обработке каждого изменения по очереди и выполнении полного обновить процесс для ассета, прежде чем перейти к следующей строке кода.

Следующий пример изменяет три ассета, копируя Asset1, перемещая Asset2и удаляя Asset3:

AssetDatabase.CopyAsset("Assets/Asset1.txt", "Assets/Text/Asset1.txt");
AssetDatabase.MoveAsset("Assets/Asset2.txt", "Assets/Text/Asset2.txt");
AssetDatabase.DeleteAsset("Assets/Asset3.txt");

Без пакетирования Unity обрабатывает каждое изменение, прежде чем перейти к следующей строке кода. Это занимает ненужное время и вызывает много обратных вызовов.

Чтобы сэкономить время, вы можете использовать AssetDatabase APIs для приостановки автоматического импорта ассетов, определения серии операций с ассетами в коде, а затем возобновления автоматического импорта. При возобновлении База данных ассетов обрабатывает определенные операции с ассетами в пакете, что быстрее, чем обработка по отдельности.

Более подробную информацию и пример реализации см. в AssetDatabase.StartAssetEditing API.

Доступ к субактивам

Файлы ассетов могут содержать множество серийных объектов, каждый из которых может рассматриваться как ассет для целей скриптов с помощью AssetDatabase класс. Например, .prefab файл asset может содержать серийизованный GameObject с несколькими присоединенными компонентами. Каждый из этих компонентов также серийизован как объект в файле asset, и поэтому при доступе к содержимому префаб asset с помощью AssetDatabase методов, компонентные объекты в файле ассета рассматриваются как субактивы.

Когда типы ассетов содержат более одного серийного объекта ассета, Unity рассматривает один из ассетов как основной ассет. Основной ассет всегда является первым ассетом, добавленным в файл, если иное не указано методом SetMainObject.

Редактор отображает некоторые типы субактивов в окне проекта. В следующем примере файл ассета FBX, содержащий модель Space Frigate, разворачивается в окне Project для отображения материала и сетки в качестве субактивов:

Файл ассета FBX в окне Project, показывающий два субактива, материал и сетку
Файл ассета FBX в окне Project, показывающий два субактива, материал и сетку

Некоторые типы суб-ассетов не отображаются в окне Project. Например, файл ассета Space Frigate в предыдущем примере фактически содержит больше, чем два суб-ассета, отображаемых в окне проекта. Вы можете увидеть реальное количество ассетов при доступе к файлу ассета с помощью методов AssetDatabase, как показано в следующем примере:

using UnityEngine;
using UnityEditor;

public class Example : MonoBehaviour
{
    [MenuItem("AssetDatabase/InspectAssets")]

    private static void InspectAssets()
    {
        Object[] data = AssetDatabase.LoadAllAssetsAtPath("Assets/Space Frigate.fbx");

        Debug.Log(data.Length + " Assets");
        foreach (Object o in data)
        {
            Debug.Log(o);
        }
    }
}

В данном случае вывод показывает, что импортированная серийная версия этого файла содержит шесть ассетов:

6 Assets
Space Frigate (UnityEngine.GameObject)
space_frigate_0 (UnityEngine.Material)
space_frigate_0 (UnityEngine.Mesh)
Space Frigate (UnityEngine.Transform)
Space Frigate (UnityEngine.MeshRenderer)
Space Frigate (UnityEngine.MeshFilter)

Это происходит потому, что GameObject, материал, сами данные сетки и каждый из компонентов, которые Unity автоматически добавляет в GameObject во время процесса импорта (Transform, MeshFilter и MeshRenderer), каждый считается отдельным серийным объектом. Поэтому они являются суб-ассетами файла ассетов, и, что касается AssetDatabase API, каждый из них является отдельным ассетом.

Заказ на импорт ассетов и выполнение кода

Порядок импорта ассетов имеет ряд важных последствий для кода. Скрипты всегда импортируются и компилируются раньше всех остальных нестандартных ассетов, поскольку они могут содержать пользовательские постпроцессоры ассетов или скриптовые импортёры, которые затем используются для импорта ассетов, не являющихся скриптами.

Атрибут [InitializeOnLoad] является обычным способом выполнения кода при запуске проекта или при изменении скриптов. Этот обратный вызов выполняется после перезагрузки домена, но перед импортом ресурсов, не связанных со скриптами. Методы, такие как AssetDatabase.LoadAssetAtPath, которые зависят от импортируемого ресурса, не будут работать, как предполагается, если их вызвать из [InitializeOnLoad]. Они возвратят null для ресурсов, импортируемых в первый раз, и возвратят устаревшую версию ресурсов, которые импортируются повторно.

Код для таможенной службы скриптовые импортерыПроцесс импортирования группирует ассеты в очереди по типу. Типы импортируются в предопределенном порядке, но порядок импортирования ассетов одного и того же типа не является детерминированным, если только не используется метод импортирования по типу. ScriptedImporter.GatherDependenciesFromSourceFile. Использование GatherDependenciesFromSourceFile также создает зависимость между ассетами, так что изменение ассета вызывает повторный импорт любых ассетов, которые зависят от него.

Примечание: Ассеты по умолчанию импортируются встроенным DefaultImporter перед ассетами скрипта, поэтому любые определенные скриптом OnPostProcessAllAssets не будут запускаться для ассетов по умолчанию.

Дополнительные ресурсы