private void InstantiateDoppleganger(Transform currentLevel) { Transform other = SKSGeneralUtils.FindAnalogousTransform(currentLevel, Doppleganger.transform, root, true); if (currentLevel.tag.Equals("MainCamera")) { currentLevel.tag = "Untagged"; } currentLevel.gameObject.name = currentLevel.gameObject.name; foreach (Component component in currentLevel.GetComponents <Component>()) { if (component is Teleportable) { component.SafeDestroyComponent(); } //Copies Transforms for later updating else if (component is Transform) { if (other) { if (!Transforms.ContainsKey(other)) { Transforms.Add(other, (Transform)component); } } else { Destroy(currentLevel.gameObject); break; } } else if (component is Renderer) { if (component is SkinnedMeshRenderer) { SkinnedRenderers.Add(component as SkinnedMeshRenderer); } if (component is Renderer) { if (!Renderers.ContainsKey((Renderer)component)) { Renderers[other.GetComponent <Renderer>()] = (Renderer)component; } //Adds colliders to list for collision ignoring upon Portal entry } } else if (component is Collider) { if (!component.GetComponent <TeleportablePhysExclude>()) { Collider c = other.GetComponent <Collider>(); if (!Colliders.ContainsKey(c.GetInstanceID())) { Colliders.Add(c.GetInstanceID(), c); } else { //Fix for VRTK double-genning body colliders for no reason currentLevel.gameObject.transform.SetParent(null); c.enabled = false; Colliders[c.GetInstanceID()].enabled = false; c.isTrigger = true; Colliders[c.GetInstanceID()].isTrigger = true; DestroyImmediate(Colliders[c.GetInstanceID()].gameObject); DestroyImmediate(currentLevel.gameObject); return; } } if (StripColliders && component) { component.SafeDestroyComponent(); } } else if (component is Rigidbody) { if (StripRigidbodies) { component.SafeDestroyComponent(); } } else if (component is Joint) { if (StripJoints) { component.SafeDestroyComponent(); } } else if (component is MonoBehaviour) { //Handling of teleportable scripts if (component is TeleportableScript) { TeleportableScripts.Add(other.GetComponent <TeleportableScript>()); } if (!StripScripts) { if (component != null) { ((MonoBehaviour)component).enabled = true; } } else { component.SafeDestroyComponent(); } //Nonspecific setup copying } else if (component is MeshFilter || component is ParticleSystem || component is Light) { //nothin to do } else { component.SafeDestroyComponent(); } } if (other) { currentLevel.gameObject.SetActive(other.gameObject.activeSelf); } foreach (Transform t in currentLevel) { InstantiateDoppleganger(t); } }