PrefabUtility.SetPropertyModifications
Declaration
public static void SetPropertyModifications(Object targetPrefab, PropertyModification[] modifications);Параметры
| Параметр | Описание |
|---|---|
| targetPrefab | Ссылка на экземпляр Префаб, который нужно изменить. Хотя тип и имя подразумевают ассет, следует указать внешний экземпляр как GameObject. |
| изменения | Набор объектов PropertyModification, которые определяют изменения в целевой экземпляр Префаб. |
Описание
Назначает набор объектов PropertyModification целевому экземпляру Префаб относительно его исходного ассета Префаб.
Важно предоставить этому методу объект верхнего уровня в ветви иерархии конечного экземпляра, чтобы избежать неожиданных результатов. Используйте GetOutermostPrefabInstanceRoot для этой цели. Поля
PropertyModification для переопределений Префаб:
- Цель: Постоянная ссылка на объект ассета Префаб
- propertyPath: Путь к изменяемому свойству
- стоимость: Значение свойства в виде строки
- objectReference: Установите это поле, если модификация является ссылкой на объект, в противном случае установите поле
value
Членами PropertyModification, которые всегда должны быть установлены, являются объект target, к которому применяется модификация (i.e. постоянная ссылка на объект ассета Префаб), propertyPath изменяемого свойства и его новый value или objectReference, как показано в следующем примере:
void MakePrefabModifications(GameObject gameObject) { // Get the outermost root from the target object GameObject prefabInstanceRoot = PrefabUtility.GetOutermostPrefabInstanceRoot(gameObject); if (prefabInstanceRoot == null) return;
// Get the corresponding prefab asset GameObject prefabAssetRoot = PrefabUtility.GetCorrespondingObjectFromSource(prefabInstanceRoot);
// Create modifications for m_Name and m_LocalScale.x var mods = new[] { new UnityEditor.PropertyModification { value = "NewName", propertyPath = "m_Name", target = prefabAssetRoot }, new UnityEditor.PropertyModification { value = "3", propertyPath = "m_LocalScale.x", target = prefabAssetRoot.transform } };
PrefabUtility.SetPropertyModifications(prefabInstanceRoot, mods); }
Следующий пример показывает пример использования PropertyModification.objectReference на Префаб, который имеет MeshRenderer:
void MakePrefabModificationUsingObjectReference(GameObject gameObject) { // Get the outermost root from the target object GameObject prefabInstanceRoot = PrefabUtility.GetOutermostPrefabInstanceRoot(gameObject); if (prefabInstanceRoot == null) return;
// Get the corresponding prefab asset GameObject prefabAssetRoot = PrefabUtility.GetCorrespondingObjectFromSource(prefabInstanceRoot);
MeshRenderer prefabMeshRenderer = prefabAssetRoot.GetComponent<MeshRenderer>(); // Create a material asset to add to the MeshRenderer Material material = new Material(Shader.Find("Diffuse")); AssetDatabase.CreateAsset(material, "Assets/MyMaterial.mat");
var mods = new[] { new UnityEditor.PropertyModification { target = prefabMeshRenderer, propertyPath = "m_Materials.Array.data[0]", objectReference = material } };
PrefabUtility.SetPropertyModifications(prefabInstanceRoot, mods); }
Обратите внимание, что вызов SetPropertyModifications заменит предыдущий набор модификаций. Если намерение состоит в накоплении модификаций, тогда извлеките текущий набор с помощью GetPropertyModifications и включите их в новый набор.
SetPropertyModifications могут быть использованы для удаления нежелательных модификаций. Чтобы удалить только модификации, не являющиеся по умолчанию, отфильтруйте их и сохраните переопределения по умолчанию, как показано ниже:
List<PropertyModification> defaultMods = new List<PropertyModification>(); PropertyModification[] mods = PrefabUtility.GetPropertyModifications(prefabInstanceRoot); foreach (var mod in mods) { if (PrefabUtility.IsDefaultOverride(mod)) defaultMods.Add(mod); }
PrefabUtility.SetPropertyModifications(prefabInstanceRoot, defaultMods.ToArray());
Для создания переопределений предпочтительным подходом является использование либо RecordPrefabInstancePropertyModifications для изменения свойств вручную, либо SerializedObject и SerializedProperty, которые автоматически генерируют переопределения.
Для применения и отмены переопределений рассмотрите возможность использования следующих API, которые обеспечивают удобный доступ к функциям Применить и Отменить:
GetObjectOverrides GetAddedComponents GetRemovedComponents GetAddedGameObjects GetRemovedGameObjects.