ObjectChangeKind
перечисление
Описание
Это перечисление описывает различные типы изменений, которые могут отслеживаться в ObjectChangeEventStream. Каждое событие имеет соответствующий тип в ObjectChangeEvents.
using UnityEditor; using UnityEngine;
[InitializeOnLoad] public class ObjectChangeEventsExample { static ObjectChangeEventsExample() { ObjectChangeEvents.changesPublished += ChangesPublished; }
static void ChangesPublished(ref ObjectChangeEventStream stream) { for (int i = 0; i < stream.length; ++i) { var type = stream.GetEventType(i); switch (type) { case ObjectChangeKind.ChangeScene: stream.GetChangeSceneEvent(i, out var changeSceneEvent); Debug.Log($"{type}: {changeSceneEvent.scene}"); break;
case ObjectChangeKind.CreateGameObjectHierarchy: stream.GetCreateGameObjectHierarchyEvent(i, out var createGameObjectHierarchyEvent); var newGameObject = EditorUtility.InstanceIDToObject(createGameObjectHierarchyEvent.instanceId) as GameObject; Debug.Log($"{type}: {newGameObject} in scene {createGameObjectHierarchyEvent.scene}."); break;
case ObjectChangeKind.ChangeGameObjectStructureHierarchy: stream.GetChangeGameObjectStructureHierarchyEvent(i, out var changeGameObjectStructureHierarchy); var gameObject = EditorUtility.InstanceIDToObject(changeGameObjectStructureHierarchy.instanceId) as GameObject; Debug.Log($"{type}: {gameObject} in scene {changeGameObjectStructureHierarchy.scene}."); break;
case ObjectChangeKind.ChangeGameObjectStructure: stream.GetChangeGameObjectStructureEvent(i, out var changeGameObjectStructure); var gameObjectStructure = EditorUtility.InstanceIDToObject(changeGameObjectStructure.instanceId) as GameObject; Debug.Log($"{type}: {gameObjectStructure} in scene {changeGameObjectStructure.scene}."); break;
case ObjectChangeKind.ChangeGameObjectParent: stream.GetChangeGameObjectParentEvent(i, out var changeGameObjectParent); var gameObjectChanged = EditorUtility.InstanceIDToObject(changeGameObjectParent.instanceId) as GameObject; var newParentGo = EditorUtility.InstanceIDToObject(changeGameObjectParent.newParentInstanceId) as GameObject; var previousParentGo = EditorUtility.InstanceIDToObject(changeGameObjectParent.previousParentInstanceId) as GameObject; Debug.Log($"{type}: {gameObjectChanged} from {previousParentGo} to {newParentGo} from scene {changeGameObjectParent.previousScene} to scene {changeGameObjectParent.newScene}."); break;
case ObjectChangeKind.ChangeGameObjectOrComponentProperties: stream.GetChangeGameObjectOrComponentPropertiesEvent(i, out var changeGameObjectOrComponent); var goOrComponent = EditorUtility.InstanceIDToObject(changeGameObjectOrComponent.instanceId); if (goOrComponent is GameObject go) { Debug.Log($"{type}: GameObject {go} change properties in scene {changeGameObjectOrComponent.scene}."); } else if (goOrComponent is Component component) { Debug.Log($"{type}: Component {component} change properties in scene {changeGameObjectOrComponent.scene}."); } break;
case ObjectChangeKind.DestroyGameObjectHierarchy: stream.GetDestroyGameObjectHierarchyEvent(i, out var destroyGameObjectHierarchyEvent); // The destroyed GameObject can not be converted with EditorUtility.InstanceIDToObject as it has already been destroyed. var destroyParentGo = EditorUtility.InstanceIDToObject(destroyGameObjectHierarchyEvent.parentInstanceId) as GameObject; Debug.Log($"{type}: {destroyGameObjectHierarchyEvent.instanceId} with parent {destroyParentGo} in scene {destroyGameObjectHierarchyEvent.scene}."); break;
case ObjectChangeKind.CreateAssetObject: stream.GetCreateAssetObjectEvent(i, out var createAssetObjectEvent); var createdAsset = EditorUtility.InstanceIDToObject(createAssetObjectEvent.instanceId); var createdAssetPath = AssetDatabase.GUIDToAssetPath(createAssetObjectEvent.guid); Debug.Log($"{type}: {createdAsset} at {createdAssetPath} in scene {createAssetObjectEvent.scene}."); break;
case ObjectChangeKind.DestroyAssetObject: stream.GetDestroyAssetObjectEvent(i, out var destroyAssetObjectEvent); // The destroyed asset can not be converted with EditorUtility.InstanceIDToObject as it has already been destroyed. Debug.Log($"{type}: Instance Id {destroyAssetObjectEvent.instanceId} with Guid {destroyAssetObjectEvent.guid} in scene {destroyAssetObjectEvent.scene}."); break;
case ObjectChangeKind.ChangeAssetObjectProperties: stream.GetChangeAssetObjectPropertiesEvent(i, out var changeAssetObjectPropertiesEvent); var changeAsset = EditorUtility.InstanceIDToObject(changeAssetObjectPropertiesEvent.instanceId); var changeAssetPath = AssetDatabase.GUIDToAssetPath(changeAssetObjectPropertiesEvent.guid); Debug.Log($"{type}: {changeAsset} at {changeAssetPath} in scene {changeAssetObjectPropertiesEvent.scene}."); break;
case ObjectChangeKind.UpdatePrefabInstances: stream.GetUpdatePrefabInstancesEvent(i, out var updatePrefabInstancesEvent); string s = ""; s += $"{type}: scene {updatePrefabInstancesEvent.scene}. Instances ({updatePrefabInstancesEvent.instanceIds.Length}):\n"; foreach (var prefabId in updatePrefabInstancesEvent.instanceIds) { s += EditorUtility.InstanceIDToObject(prefabId).ToString() + "\n"; } Debug.Log(s); break; } } } }
Свойства
| Свойство | Описание |
|---|---|
| None | Указывает неинициализованное значение. |
| ChangeScene | Изменение этого типа указывает, что открытая сцена была изменена ("загрязнена") без какой-либо конкретной информации. Это происходит, например, когда используется EditorSceneManager.MarkSceneDirty. |
| CreateGameObjectHierarchy | Изменение этого типа указывает на то, что был создан GameObject, возможно с дополнительными объектами ниже него в иерархии. Это происходит, например, когда Undo.RegisterCreatedObjectUndo используется с GameObject. |
| ChangeGameObjectStructureHierarchy | Изменение этого типа указывает на то, что структура GameObject изменилась и что любая GameObject в иерархии ниже неё может измениться. Это происходит, например, когда используется Undo.RegisterFullObjectHierarchyUndo. |
| ChangeGameObjectStructure | Изменение этого типа указывает на изменение структуры GameObject. Это происходит, когда компонент добавляется или удаляется из GameObject с помощью Undo.AddComponent или Undo.DestroyObjectImmediate. |
| ChangeGameObjectParent | Изменение этого типа указывает, что родитель GameObject изменился. Это происходит, когда используются Undo.SetTransformParent или SceneManager.MoveGameObjectToScene. |
| ChangeGameObjectOrComponentProperties | Изменение этого типа указывает на то, что изменилось свойство GameObject или Компонента. Это происходит, например, когда Undo.RecordObject используется с экземпляром Компонента. |
| DestroyGameObjectHierarchy | Изменение такого типа указывает на то, что GameObject и вся иерархия под ним были уничтожены. Это происходит, например, когда Undo.DestroyObjectImmediate используется с GameObject. |
| CreateAssetObject | Изменение этого типа указывает на то, что объект asset был создан. Это происходит, например, когда Undo.RegisterCreatedObjectUndo используется с экземпляром asset (e.g. Texture). Обратите внимание, что это касается только создания объектов asset в памяти, а не создания новых asset в проекте на диске. |
| DestroyAssetObject | Изменение этого типа указывает на то, что объект asset был уничтожен. Это происходит, например, когда Undo.DestroyObjectImmediate используется с экземпляром asset (e.g. Texture). Обратите внимание, что это касается только уничтожения объектов asset в памяти, а не удаления asset в проекте на диске. |
| ChangeAssetObjectProperties | Изменение этого типа указывает на изменение свойства объекта ассета в памяти. Это происходит, например, когда Undo.RecordObject используется с экземпляром ассета (e.g. Текстура). Обратите внимание, что это касается только изменений объектов ассета в памяти, а не изменений ассетов в проекте на диске. |
| UpdatePrefabInstances | Изменение этого типа указывает, что экземпляры префаб в открытой сцене были обновлены из-за изменения в источнике префаб. |
| ChangeChildrenOrder | Изменение этого типа указывает на то, что дочерняя функция была переупорядочена в иерархии под тем же родителем. Это происходит при вызове Undo.RegisterChildrenOrderUndo или при переупорядочении дочерней функции в иерархии под тем же родителем. |
| ChangeRootOrder | Изменение этого типа указывает на то, что GameObject, расположенный в корне сцены, был переупорядочен в иерархии. Это происходит при вызове Undo.SetSiblingIndex или при переупорядочении такого GameObject в иерархии под той же сценой. |