Unity 6.3
0 онлайн 77 гостей 3 в системе
Вход

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,.

Свойства

Свойство Описание
assetGUIDGUID для ассета, к которому принадлежит объект, на который сделана ссылка.
identifierTypeТип идентификатора объекта ссылки, представленный в виде целого числа.
targetObjectIdЛокальный файл ID объекта ссылки.
targetPrefabIdID экземпляра префаб, содержащего объект, на который сделана ссылка.

Открытые методы

Метод Описание
CompareToСравнивает этот уникальный идентификатор объекта с другим, чтобы определить их относительное положение в порядке сортировки.
EqualsПроверяет, равны ли этот уникальный идентификатор объекта и другой.
ToStringПолучает строковое представление уникального идентификатора объекта.

Статические методы

Метод Описание
GetGlobalObjectIdSlowПолучает уникальные идентификаторы объектов на основе ссылки на объект.
GetGlobalObjectIdsSlowСоздает массив уникальных идентификаторов объектов на основе массива объектов.
GlobalObjectIdentifiersToEntityIdsSlowСоздает массив экземпляра IDs на основе массива уникальных идентификаторов объектов.
GlobalObjectIdentifiersToObjectsSlowСоздает массив ссылок на объекты на основе массива уникальных идентификаторов объектов.
GlobalObjectIdentifierToEntityIdSlowПолучает EntityId объекта из его уникального идентификатора объекта.
GlobalObjectIdentifierToObjectSlowПолучает ссылку на объект по его уникальному идентификатору объекта.
TryParseПытается разобрать строковое представление GlobalObjectId в структуру GlobalObjectId.