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

GlobalObjectId

UnityEditor 中的结构体

建议更改

成功!

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

关闭

提交失败

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

关闭

取消

描述

场景和其它类型资源中对象的唯一且稳定的项目范围标识符,用于创作时使用。

使用此结构体获取属于场景或其他资源(如预制体和 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.GetGlobalObjectIdSlowGlobalObjectId.GetGlobalObjectIdsSlow

对于位于场景中的对象(其 GlobalObjectId.identifierType = 2),GlobalObjectId 包含场景 ID 作为 assetGUID,这意味着

  • 将对象移动到新场景会更改其 GlobalObjectId
  • 您必须至少保存一次场景,然后才能获取当前场景中对象的 GlobalObjectId。否则,assetGUID 值为 null。
  • 仅当该场景已加载时,才能将引用场景内对象的 GlobalObjectId 解析回实例 ID 或对象。

以下性能注意事项适用于 GlobalObjectId

  • 当将多个对象或实例 ID 转换为或从 GlobalObjectId 对象转换时,始终使用批处理方法进行一次调用比进行单独调用更快。例如,对 GlobalObjectIdentifiersToObjectsSlow 进行一次调用比对 GlobalObjectIdentifierToObjectSlow 进行多次调用快得多。
  • 此结构体中的方法以 Slow 结尾,表示它们会影响性能。如果您在大型项目中将这些方法用于其他性能敏感的上下文中(例如 ISerializationCallbackReceiver.OnBeforeSerializeISerializationCallbackReceiver.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); } }

属性

assetGUID引用的对象所属资源的 GUID。
identifierType引用的对象的标识符类型,以整数表示。
targetObjectId引用的对象的本地文件 ID。
targetPrefabId包含引用的对象的预制体实例的 ID。

公共方法

CompareTo将此唯一对象标识符与另一个对象标识符进行比较,以确定它们在排序顺序中的相对位置。
Equals检查此唯一对象标识符与另一个对象标识符是否相等。
ToString获取唯一对象标识符的字符串表示形式。

静态方法

GetGlobalObjectIdSlow根据对象引用获取唯一对象标识符。
GetGlobalObjectIdsSlow根据对象数组创建唯一对象标识符数组。
GlobalObjectIdentifiersToInstanceIDsSlow根据唯一对象标识符数组创建实例 ID 数组。
GlobalObjectIdentifiersToObjectsSlow根据唯一对象标识符数组创建对象引用数组。
GlobalObjectIdentifierToInstanceIDSlow根据唯一对象标识符获取对象的实例 ID。
GlobalObjectIdentifierToObjectSlow根据唯一对象标识符获取对对象的引用。
TryParse尝试将 GlobalObjectId 的字符串表示形式解析为 GlobalObjectId 结构体。