В версиях Unity до Unity 5 активы зависимостиВ контексте диспетчера пакетов зависимость — это конкретная версия пакета (выраженная в форме имя_пакета@версия_пакета
), которая требуется проекту или другому пакету для работы. Проекты и пакеты используют атрибут dependencies в своих манифестах для определения набора требуемых пакетов. Для проектов это считается прямой зависимостью; для пакетов это косвенные или транзитивные зависимости. Подробнее
См. в Словарь необходимо было определить с помощью редактора скриптыЧасть кода, позволяющая создавать собственные компоненты, запускать игровые события, изменять свойства компонентов с течением времени и реагировать на действия пользователя в как вам угодно. Подробнее
См. только в Словарь. (В Unity 5 мы предоставляем инструменты в редакторе для назначения ресурсов конкретным пакетам, а обработка зависимостей осуществляется автоматически). Эта информация предназначена для тех, кто работает над устаревшими проектами в Unity 4, и говорит о том, что вы используете Unity 4.
Каждый объект в наборе может зависеть от других ресурсов. Например, модель может включать материалы, которые, в свою очередь, используют текстуры и шейдерыпрограмму, работающую на графическом процессоре. Подробнее
См. в Словарь. Можно включить все зависимости ассета вместе с ним в его бандл. Однако несколько ресурсов из разных пакетов могут зависеть от общего набора других ресурсов (например, несколько различных моделей зданий могут использовать одну и ту же текстуру кирпича). Если отдельная копия общей зависимости включена в каждый пакет, который использует объекты, то при загрузке пакетов будут созданы избыточные экземпляры ресурсов. Это приведет к потере памяти.
Чтобы избежать таких потерь, можно выделить общие зависимости в отдельный пакет и просто ссылаться на них из любых пакетов с активами, которые в них нуждаются. Во-первых, функция ссылок должна быть включена вызовом BuildPipeline.PushAssetDependencies. Затем необходимо собрать пакет, содержащий указанные зависимости. Затем следует сделать еще один вызов PushAssetDependencies перед созданием пакетов, которые ссылаются на активы из первого пакета. Дополнительные уровни зависимости можно ввести с помощью дополнительных вызовов PushAssetDependencies. Ссылочные уровни хранятся в стеке, поэтому можно вернуться на уровень назад с помощью соответствующей функции BuildPipeline.PopAssetDependencies. Вызовы push и pop должны быть сбалансированы, включая начальный push, который происходит перед сборкой.
Во время выполнения вам необходимо загрузить пакет, содержащий зависимости, перед любым другим пакетом, который на них ссылается. Например, вам потребуется загрузить пакет общих текстур перед загрузкой отдельного пакета материалов, которые ссылаются на эти текстуры.
Идентификаторы объектов
Если вы предполагаете, что вам потребуется перестроить наборы ресурсов, которые являются частью цепочки зависимостей, вам следует создавать их с включенным параметром BuildAssetBundleOptions.DeterministicAssetBundle. Это гарантирует, что значения внутреннего идентификатора, используемые для идентификации ресурсов, будут одинаковыми при каждой пересборке пакета.
При создании пакета ресурсов с помощью этого метода объектам в нем назначается 32-битный хэш-код, который рассчитывается с использованием имени файла пакета ресурсов, GUID ресурса и локального идентификатора объекта в активе. . По этой причине обязательно используйте то же имя файла при восстановлении. Также обратите внимание, что наличие большого количества объектов может привести к столкновениям хэшейСтолкновение происходит, когда физический движок обнаруживает, что коллайдеры двух игровых объектов создают контакт или перекрытие, когда хотя бы один из них имеет компонент Rigidbody и находится в движении. Подробнее
См. Словарь, запрещающий Unity создавать набор ресурсов.
Зависимости шейдеров
Всякий раз, когда на шейдеры прямо ссылаются как на параметры в BuildPipeline.BuildAssetBundle или косвенно с параметром BuildAssetBundleOptions.CollectDependencies код шейдера включен в комплект ресурсов. Это может вызвать проблему, если вы используете только BuildAssetBundle для создания нескольких пакетов ресурсов, поскольку шейдеры, на которые ссылаются, будут включены в каждый созданный пакет. Могут быть конфликты, например, когда вы смешиваете разные версии шейдера, поэтому вам придется пересобирать все свои бандлы после модификации шейдеров. Код шейдера также увеличит размер пакетов. Чтобы избежать этих проблем, вы можете использовать BuildPipeline.PushAssetDependencies для разделения шейдеров в одном пакете, что позволит вам обновлять только пакет шейдера. В качестве примера того, как реализовать этот рабочий процесс, вы можете создать префабтип актива, который позволяет хранить GameObject вместе с компоненты и свойства. Префаб действует как шаблон, из которого вы можете создавать новые экземпляры объектов на сцене. Подробнее
См. в Словаре, где есть ссылки на необходимые шейдеры:
Пример C#
using UnityEngine;
public class ShadersList : MonoBehaviour {
public Shader[] list;
}
Создайте пустой объект, назначьте скрипт, добавьте шейдеры в список и создайте префаб, то есть «Список шейдеров». Затем вы можете создать экспортер, который генерирует все пакеты и обновляет набор шейдеров:
Пример C#
using UnityEngine;
using UnityEditor;
public class Exporter : MonoBehaviour {
[MenuItem("Assets/Export all asset bundles")]
static void Export() {
BuildAssetBundleOptions options =
BuildAssetBundleOptions.CollectDependencies |
BuildAssetBundleOptions.CompleteAssets |
BuildAssetBundleOptions.DeterministicAssetBundle;
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/ShadersList.prefab"), null, "Data/ShadersList.unity3d", options);
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Scene1.prefab"), null, "Data/Scene1.unity3d", options);
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/Scene2.prefab"), null, "Data/Scene2.unity3d", options);
BuildPipeline.PopAssetDependencies();
BuildPipeline.PopAssetDependencies();
}
[MenuItem("Assets/Update shader bundle")]
static void ExportShaders() {
BuildAssetBundleOptions options =
BuildAssetBundleOptions.CollectDependencies |
BuildAssetBundleOptions.CompleteAssets |
BuildAssetBundleOptions.DeterministicAssetBundle;
BuildPipeline.PushAssetDependencies();
BuildPipeline.BuildAssetBundle(AssetDatabase.LoadMainAssetAtPath("Assets/ShadersList.prefab"), null, "Data/ShadersList.unity3d", options);
BuildPipeline.PopAssetDependencies();
}
}
Помните, что сначала необходимо загрузить пакет шейдеров. Одним из недостатков этого метода является то, что параметр BuildAssetBundleOptions.DeterministicAssetBundle может привести к конфликтам из-за коллизии хэшей, когда количество объектов слишком велико. В этом случае сборка завершится ошибкой, и обновить только пакет шейдеров будет невозможно. В этом случае вам придется удалить эту опцию и перестроить все наборы ресурсов.