public IHierarchyElement GetHierarchyElement(string ownerGuid, ulong anchor, PrefabImportCache prefabImportCache) { if (myLocalAnchorToHierarchyElement.TryGetValue(anchor, out var result)) { if (!result.IsStripped || prefabImportCache == null) // stipped means, that element is not real and we should import prefab { return(result); } } if (result != null && IsScene && result.IsStripped) { var prefabInstance = result.PrefabInstance; var correspondingObject = result.CorrespondingSourceObject; if (prefabInstance != null && correspondingObject != null) { anchor = PrefabsUtil.Import(prefabInstance.LocalDocumentAnchor, correspondingObject.LocalDocumentAnchor); } } if (prefabImportCache != null) { var elements = prefabImportCache.GetImportedElementsFor(ownerGuid, this); if (elements.TryGetValue(anchor, out var importedResult)) { return(importedResult); } } return(null); }
public IHierarchyElement GetHierarchyElement(Guid?ownerGuid, ulong anchor, PrefabImportCache prefabImportCache) { var result = SearchForAnchor(anchor); if (result != null) { if (!(result is IStrippedHierarchyElement) || prefabImportCache == null) // stipped means, that element is not real and we should import prefab { return(result); } } // In prefabs files, anchor for stripped element is always generated by formula in PrefabsUtil. This means // that after we import elements from prefab file into another file, we could reuse anchor from stripped element to // get real element (in current implementation, imported objects are store in PrefabImportCache) // It is not true(!!!) for scene files, anchors for scene files could be generated by sequence generator. This means, // that anchor for stripped element could be '19' for example, but imported element will have another anchor. // // To unify all logic, if ownerGuid is related to scene file and achor points to stripped file, we will // use new anchor which calculated in same way with prefab import if (result != null && IsScene && result is IStrippedHierarchyElement strippedHierarchyElement) { var prefabInstance = strippedHierarchyElement.PrefabInstance; var correspondingObject = strippedHierarchyElement.CorrespondingSourceObject; anchor = PrefabsUtil.GetImportedDocumentAnchor(prefabInstance.LocalDocumentAnchor, correspondingObject.LocalDocumentAnchor); } if (prefabImportCache != null && ownerGuid != null) { var elements = prefabImportCache.GetImportedElementsFor(ownerGuid.Value, this); if (elements.TryGetValue(anchor, out var importedResult)) { return(importedResult); } } return(null); }