GlobalObjectId
структура в UnityEditor
Описание
Уникальный и стабильный идентификатор проекта для объектов в сценах и других типах ресурсов для использования во время создания.
С помощью этой структуры получают уникальные идентификаторы объектов, входящих в сцены или в другие ассеты — префабы и ScriptableObject. Эти идентификаторы стабильны и сохраняются между сеансами редактирования и операциями сериализации: сменой активной сцены, сохранением и повторной загрузкой.
Вы можете использовать GlobalObjectId в ваших рабочих процессах Unity Editor, включая инструменты написания авторских работ.
Примечание: GlobalObjectId идентификаторы не могут быть использованы во время выполнения приложения в режиме воспроизведения редактора или в автономных сборках проигрывателя.
Примечание: Вы не можете использовать AssetDatabase.TryGetGUIDAndLocalFileIdentifier для ссылки на объекты, которые находятся внутри сцены. Используйте GlobalObjectId вместо этого.
Вы можете создать GlobalObjectId для объектов, наследующих от UnityEngine.Object и которые находятся внутри сцен или в других типах ассетов, таких как префабы и ScriptableObjects.
Формат строкового представления ID: GlobalObjectId_V1-{i}-{a}-{l}-{p}где:
{i}— тип идентификатора, представленный целым числом (0 = Null, 1 = Импортированный ресурс, 2 = Объект Scene, 3 = Исходный ресурс).{a}ассет GUID. Это глобальный уникальный идентификатор, который Unity для каждого вновь обнаруженного ассета. Для получения дополнительной информации см. Метаданные активов в Руководстве.{l}— локальный файл ID объекта. Для объектов внутри экземпляра префаб этот ID — локальный файл ID первоначального исходного объекта, который является частью префаб.{p}— локальный файл ID экземпляра префаб объекта. Если объект не является частью экземпляра префаб, то{p}— это0.
Примечание: Фактические локальные файлы IDs имеют 64-битные значения и могут быть отрицательными. GlobalObjectId, эти значения переносятся на GlobalObjectId.targetObjectId, которое беззнаковое 64-разрядное значение (ulongТаким образом, отрицательный локальный файл ID потеряет свой знак при сохранении в GlobalObjectId и вы не должны полагаться на значение targetObjectId, или {l} элемент из строкового представления GlobalObjectID, чтобы найти объект.
Каждое из этих значений хранится отдельно в качестве свойства в GlobalObjectId структура. Строка не является нативным представлением, но её можно получить из GlobalObjectId.ToString.
По умолчанию null ID является GlobalObjectId_V1-0-00000000000000000000000000000000-0-0.
Чтобы получить GlobalObjectId для объекта или массива объектов, основанных на ссылке на объект или экземпляре ID, используйте GlobalObjectId.GetGlobalObjectIdSlow или GlobalObjectId.GetGlobalObjectIdsSlow.
Для объектов, которые находятся внутри сцены (те, для которых GlobalObjectId.identifierType = 2), GlobalObjectId включает сцену ID в качестве assetGUID, что означает следующее:
- Перемещение объекта в новую сцену изменяет его
GlobalObjectId. - Вы должны сохранить сцену хотя бы один раз, прежде чем вы сможете получить
GlobalObjectIdдля объекта в текущей сцене. В противном случае значениеassetGUIDбудет нулевым. GlobalObjectId, который ссылается на объект внутри сцены, может быть разрешен обратно на экземпляр ID или объект только тогда, когда эта сцена уже загружена.
Для GlobalObjectId в целом применяются следующие соображения, касающиеся эффективности:
- При преобразовании нескольких объектов или экземпляров IDs в объекты
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 | Создает массив уникальных идентификаторов объектов на основе массива объектов. |
| GlobalObjectIdentifiersToEntityIdsSlow | Создает массив экземпляра IDs на основе массива уникальных идентификаторов объектов. |
| GlobalObjectIdentifiersToObjectsSlow | Создает массив ссылок на объекты на основе массива уникальных идентификаторов объектов. |
| GlobalObjectIdentifierToEntityIdSlow | Получает EntityId объекта из его уникального идентификатора объекта. |
| GlobalObjectIdentifierToObjectSlow | Получает ссылку на объект по его уникальному идентификатору объекта. |
| TryParse | Пытается разобрать строковое представление GlobalObjectId в структуру GlobalObjectId. |