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

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.