版本: Unity 6 (6000.0)
语言英语
  • C#

ObjectChangeKind

枚举

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们确实会阅读用户提出的每一个更改建议,并在适当的情况下进行更新。

关闭

提交失败

由于某种原因,您的更改建议无法提交。请 <a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

此枚举描述了可以在 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; } } } }

属性

表示未初始化的值。
ChangeScene此类型的更改表示已更改打开的场景(“已修改”),但没有提供更多具体信息。例如,当使用 EditorSceneManager.MarkSceneDirty 时,会发生这种情况。
CreateGameObjectHierarchy此类型的更改表示已创建了一个游戏对象,可能在层次结构中在其下方附加了其他对象。例如,当使用 Undo.RegisterCreatedObjectUndo 与一个游戏对象一起使用时,会发生这种情况。
ChangeGameObjectStructureHierarchy此类型的更改表示游戏对象的结构已更改,层次结构中其下方的任何游戏对象都可能已更改。例如,当使用 Undo.RegisterFullObjectHierarchyUndo 时,会发生这种情况。
ChangeGameObjectStructure此类型的更改表示游戏对象的结构已更改。当使用 Undo.AddComponent 或 Undo.DestroyObjectImmediate 向游戏对象添加或删除组件时,会发生这种情况。
ChangeGameObjectParent此类型的更改表示游戏对象的父对象已更改。当使用 Undo.SetTransformParent 或 SceneManager.MoveGameObjectToScene 时,会发生这种情况。
ChangeGameObjectOrComponentProperties此类型的更改表示游戏对象或组件的属性已更改。例如,当使用 Undo.RecordObject 与组件实例一起使用时,会发生这种情况。
DestroyGameObjectHierarchy此类型的更改表示游戏对象及其下方的整个层次结构已销毁。例如,当使用 Undo.DestroyObjectImmediate 与游戏对象一起使用时,会发生这种情况。
CreateAssetObject此类型的更改表示已创建了一个资产对象。例如,当使用 Undo.RegisterCreatedObjectUndo 与资产实例(例如,纹理)一起使用时,会发生这种情况。请注意,这仅涵盖内存中资产对象的创建,而不是磁盘上项目的创建。
DestroyAssetObject此类型的更改表示已销毁了一个资产对象。例如,当使用 Undo.DestroyObjectImmediate 与资产实例(例如,纹理)一起使用时,会发生这种情况。请注意,这仅涵盖内存中资产对象的销毁,而不是磁盘上项目的删除。
ChangeAssetObjectProperties此类型的更改表示内存中资产对象的属性已更改。例如,当使用 Undo.RecordObject 与资产实例(例如,纹理)一起使用时,会发生这种情况。请注意,这仅涵盖内存中资产对象的更改,而不是磁盘上项目的更改。
UpdatePrefabInstances此类型的更改表示由于源预制件发生了更改,打开的场景中的预制件实例已更新。
ChangeChildrenOrder此类型的更改表示子对象在同一父对象下方的层次结构中已重新排序。当调用 Undo.RegisterChildrenOrderUndo 或在同一父对象下方的层次结构中重新排序子对象时,会发生这种情况。
ChangeRootOrder此类型的更改表示已在场景根目录中放置的游戏对象在层次结构中已重新排序。当调用 Undo.SetSiblingIndex 或在同一场景下方的层次结构中重新排序此类游戏对象时,会发生这种情况。