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

AssetPostprocessor.OnPostprocessPrefab(GameObject root)

Описание

Получает уведомление, когда Префаб завершает импорт.

Чтобы использовать эту функцию, добавьте её в производный класс. Она позволяет изменять импортируемый GameObject. GameObject существуют только во время импорта, после чего Unity сразу их уничтожает.

Функция вызывается до создания импортированного Prefab в папке Library и до его записи на диск. Поэтому вы полностью управляете создаваемыми GameObject и Component.

После завершения импорта Unity все ссылки на GameObject становятся недействительными. Следовательно, нельзя создать новый Prefab в файле, отличном от OnPostprocessPrefab, который ссылается на меши из импортированного файла Prefab.

Чтобы добавить в Prefab новые объекты Asset, вызовите AssetPostprocessor.context.AddObjectToAsset.

Постпроцессор может задавать или изменять hideFlags объектов в Prefab. К добавленным объектам Asset всегда добавляются флаги DontSaveInEditor и NotEditable. К добавленным GameObject и Component всегда добавляется флаг DontSaveInEditor. Он предотвращает сохранение объекта обратно в исходный ресурс Prefab, иначе при каждом сохранении Prefab создаваемые объекты дублировались бы.

Важно: изменения, внесённые в OnPostprocessPrefab, влияют только на импортированный Prefab в папке Library, но не на исходный ресурс Prefab. В режиме редактирования Prefab Unity отображает исходный Prefab из папки Assets, поэтому изменения, выполненные при импорте, не видны и не могут быть сохранены обратно в исходный ресурс. Если нужны постоянные, контролируемые системой версий изменения исходного Prefab, которые видны в режиме редактирования Prefab, используйте API, например AssetDatabase.LoadMainAssetAtPath и PrefabUtility.SavePrefabAsset, вместо OnPostprocessPrefab.

Параметр root — это GameObject верхнего уровня импортированной иерархии Prefab. Он содержит все остальные GameObject Prefab как дочерние объекты или потомки.

using UnityEngine;
using UnityEditor;

// Adds a mesh collider to each game object that contains collider in its name public class Example : AssetPostprocessor { // Increment the version number, when the AssetPostprocessors code/behavior is changed static readonly uint k_Version = 0; public override uint GetVersion() { return k_Version; }

void OnPostprocessPrefab(GameObject g) { Apply(g.transform); }

void Apply(Transform t) { if (t.name.ToLower().Contains("collider")) t.gameObject.AddComponent<MeshCollider>();

// Recurse foreach (Transform child in t) Apply(child); } }