globalobjectid
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
globalobjectid [2021/02/08 06:57] – [Prefabs] uninomiconadmin | globalobjectid [2025/01/15 04:35] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 5: | Line 5: | ||
GlobalObjectIds are not available at runtime. However, they are available in Play Mode in the editor. If you use these in play mode, keep in mind the notes on prefabs below. | GlobalObjectIds are not available at runtime. However, they are available in Play Mode in the editor. If you use these in play mode, keep in mind the notes on prefabs below. | ||
- | ===== Prefabs ===== | + | ===== Prefabs |
//All notes below only apply to running the game in Play mode in the Editor.// | //All notes below only apply to running the game in Play mode in the Editor.// | ||
- | Prefabs Instances have a GID value that is different from the GID assigned when the game is run in Play Mode. When a scene is loaded in play mode, prefabs are merged | + | When a scene is loaded in play mode, prefabs are unpacked |
- | + | ||
- | Whatever process that Unity uses to unpack gameobjects(( | + | |
- | I've seen this mentioned in the profiler as Prefabs.MergePrefabs, | + | |
- | )) must be determinstic, | + | |
For example. You may have a prefab in the scene with GID: | For example. You may have a prefab in the scene with GID: | ||
Line 23: | Line 19: | ||
'' | '' | ||
- | (Note how the zero at the end of the second GID implies the object is no longer a prefab, which is correct). Clearly, some aspects of the prefab are distilled down into the '' | + | Note how the zero at the end of the second GID implies the object is no longer a prefab, which is correct. |
- | Perhaps it's some hashing of the prefabInstanceId? | + | |
+ | ==== Converting a Prefab Gid to an Unpacked Gid ==== | ||
+ | |||
+ | You can convert between the two using the following formula:(( | ||
+ | Source: [[https:// | ||
)) | )) | ||
- | Consequently, it is possible to get the unpacked GID of a prefab in the Editor scene by calling '' | + | '' |
+ | |||
+ | ++++ Example Code| | ||
+ | |||
+ | <code csharp> | ||
+ | private static GlobalObjectId ConvertPrefabGidToUnpackedGid(GlobalObjectId id) | ||
+ | { | ||
+ | ulong fileId = (id.targetObjectId ^ id.targetPrefabId) & 0x7fffffffffffffff; | ||
+ | bool success = GlobalObjectId.TryParse( | ||
+ | $" | ||
+ | out GlobalObjectId unpackedGid); | ||
+ | Assert.IsTrue(success); | ||
+ | return unpackedGid; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ++++ | ||
+ | |||
+ | ===== Bug: Querying deleted objects ===== | ||
+ | When calling '' | ||
+ | |||
+ | For example, in this case, when passed an array of only scene objects: | ||
+ | {{ : | ||
+ | |||
+ | The function will return non-scene objects | ||
+ | {{ : | ||
+ | |||
+ | This seems to be a bug. The correct result should have been '' | ||
+ | |||
+ | I have had some luck < | ||
+ | Update: This is fixed in 2021.1 [[https:// | ||
globalobjectid.1612767435.txt.gz · Last modified: 2025/01/15 04:35 (external edit)