场景和其它类型资源中对象的唯一且稳定的项目范围标识符,用于创作时使用。
使用此结构体获取属于场景或其他资源(如预制体和 ScriptableObjects)的对象的唯一标识符。这些标识符在编辑会话和数据序列化操作(例如更改活动场景以及保存和重新加载)中保持稳定和持久。
您可以在 Unity 编辑器工作流程中使用 GlobalObjectId
,包括编写创作工具。
注意:GlobalObjectId
标识符不能在应用程序运行时、编辑器的播放模式或独立 Player 构建中使用。
注意:不能使用 AssetDatabase.TryGetGUIDAndLocalFileIdentifier 来引用场景内的对象。请改用 GlobalObjectId
。
您可以为继承自 UnityEngine.Object
且位于场景或其他类型资源(如预制体和 ScriptableObjects)中的对象创建 GlobalObjectId
。
ID 的字符串表示形式的格式为 GlobalObjectId_V1-{i}-{a}-{l}-{p}
,其中
{i}
是由整数表示的标识符类型(0 = Null,1 = 导入的资源,2 = 场景对象,3 = 源资源)。{a}
是资源 GUID。这是 Unity 为每个新发现的资源分配的全局唯一标识符。有关更多信息,请参阅手册中的 资源元数据。{l}
是对象的本地文件 ID。对于预制体实例内的对象,此 ID 是作为预制体一部分的原始源对象的本地文件 ID。{p}
是对象的预制体实例的本地文件 ID。如果对象不是预制体实例的一部分,则 {p}
为 0
。
注意:实际的本地文件 ID 是带符号的 64 位值,可以为负数。但在 GlobalObjectId
中,这些值会被转换为 GlobalObjectId.targetObjectId,后者是无符号的 64 位值 (ulong
)。因此,负的本地文件 ID 在保存到 GlobalObjectId
时会丢失其符号,并且您不应依赖 targetObjectId
的值或 GlobalObjectID
字符串表示形式中的 {l}
元素来查找对象。
这些值中的每一个都作为 GlobalObjectId
结构体中的属性单独存储。字符串不是本机表示形式,但可以通过 GlobalObjectId.ToString 获取。
默认空 ID 为 GlobalObjectId_V1-0-00000000000000000000000000000000-0-0
。
要根据对象引用或实例 ID 获取对象的 GlobalObjectId
或对象数组,请使用 GlobalObjectId.GetGlobalObjectIdSlow 或 GlobalObjectId.GetGlobalObjectIdsSlow。
对于位于场景中的对象(其 GlobalObjectId.identifierType = 2
),GlobalObjectId
包含场景 ID 作为 assetGUID
,这意味着
GlobalObjectId
。GlobalObjectId
。否则,assetGUID
值为 null。GlobalObjectId
解析回实例 ID 或对象。以下性能注意事项适用于 GlobalObjectId
GlobalObjectId
对象转换时,始终使用批处理方法进行一次调用比进行单独调用更快。例如,对 GlobalObjectIdentifiersToObjectsSlow
进行一次调用比对 GlobalObjectIdentifierToObjectSlow
进行多次调用快得多。Slow
结尾,表示它们会影响性能。如果您在大型项目中将这些方法用于其他性能敏感的上下文中(例如 ISerializationCallbackReceiver.OnBeforeSerialize 或 ISerializationCallbackReceiver.OnAfterDeserialize),强烈建议分析性能影响。// Create an empty C# in your project and paste in the following code.
using UnityEngine; using UnityEditor; using UnityEditor.SceneManagement;
// The example creates a new Editor menu item called Example. When you select Example > GlobalObjectId, // the code creates a new scene with two GameObjects called MyPlane and MyCube and obtains the // GlobalObjectIds for these objects. The code then reloads the scene and uses the GlobalObjectIds to // obtain references to the original MyPlane and MyCube objects, printing conformation to the console. public class GlobalObjectIdExample { [MenuItem("Example/GlobalObjectId")] static void MenuCallback() { const string testScenePath = "Assets/MyTestScene.unity";
var stringIds = CreateSceneWithTwoObjects(testScenePath);
// These string-formatted IDs can be saved to a file, then retrieved in a later session of Unity. Debug.Log("IDs of new objects " + stringIds[0] + " and " + stringIds[1]);
ReloadSceneAndResolveObjects(testScenePath, stringIds); }
static string[] CreateSceneWithTwoObjects(string testScenePath) { var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
// Scene must have been serialized at least once prior to generating GlobalObjectIds, so that the asset GUID is available. EditorSceneManager.SaveScene(scene, testScenePath);
// Create objects in scene. var objects = new Object[2]; objects[0] = GameObject.CreatePrimitive(PrimitiveType.Plane); objects[0].name = "MyPlane"; objects[1] = GameObject.CreatePrimitive(PrimitiveType.Cube); objects[1].name = "MyCube";
// Get GlobalObjectId for all objects. var ids = new GlobalObjectId[2]; GlobalObjectId.GetGlobalObjectIdsSlow(objects, ids);
// Save and close the scene. EditorSceneManager.SaveScene(scene, testScenePath); EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
// Return the GlobalObjectId of all objects in the scene. var idsStringFormat = new string[2]; idsStringFormat[0] = ids[0].ToString(); idsStringFormat[1] = ids[1].ToString();
return idsStringFormat; }
// This method resolves the GlobalObjectIDs into object references after the scene is reloaded. static void ReloadSceneAndResolveObjects(string testScenePath, string[] objectIdsAsStrings) { // Convert string IDs into GlobalObjectId objects. var ids = new GlobalObjectId[2]; GlobalObjectId.TryParse(objectIdsAsStrings[0], out ids[0]); GlobalObjectId.TryParse(objectIdsAsStrings[1], out ids[1]);
// Load the scene before the resolving the IDs to objects references. EditorSceneManager.OpenScene(testScenePath);
var objects = new Object[2]; GlobalObjectId.GlobalObjectIdentifiersToObjectsSlow(ids, objects);
// Print the result. Debug.Log("Found " + objects[0].name + " and " + objects[1].name); } }
其他资源:Object.GetInstanceID、AssetDatabase.AssetPathToGUID、AssetDatabase.TryGetGUIDAndLocalFileIdentifier。
assetGUID | 引用的对象所属资源的 GUID。 |
identifierType | 引用的对象的标识符类型,以整数表示。 |
targetObjectId | 引用的对象的本地文件 ID。 |
targetPrefabId | 包含引用的对象的预制体实例的 ID。 |
CompareTo | 将此唯一对象标识符与另一个对象标识符进行比较,以确定它们在排序顺序中的相对位置。 |
Equals | 检查此唯一对象标识符与另一个对象标识符是否相等。 |
ToString | 获取唯一对象标识符的字符串表示形式。 |
GetGlobalObjectIdSlow | 根据对象引用获取唯一对象标识符。 |
GetGlobalObjectIdsSlow | 根据对象数组创建唯一对象标识符数组。 |
GlobalObjectIdentifiersToInstanceIDsSlow | 根据唯一对象标识符数组创建实例 ID 数组。 |
GlobalObjectIdentifiersToObjectsSlow | 根据唯一对象标识符数组创建对象引用数组。 |
GlobalObjectIdentifierToInstanceIDSlow | 根据唯一对象标识符获取对象的实例 ID。 |
GlobalObjectIdentifierToObjectSlow | 根据唯一对象标识符获取对对象的引用。 |
TryParse | 尝试将 GlobalObjectId 的字符串表示形式解析为 GlobalObjectId 结构体。 |