private void CreateCloneHirearchy(GameObject original, GameObject clone, int CloneLayer) { foreach (Transform child in original.transform) { if (child.tag != "Clone" && child.tag != "Clip Collider") { GameObject childClone = child.gameObject.Clone("in-clone", child.gameObject.layer, new System.Type[] { typeof(MeshFilter), typeof(MeshRenderer), typeof(Collider), typeof(CollisionTest) }, true); childClone.tag = "Inside Portal"; childClone.transform.parent = clone.transform; childClone.transform.localPosition = child.localPosition; childClone.transform.localRotation = child.localRotation; childClone.transform.localScale = child.localScale; MeshRenderer objMR = child.gameObject.GetComponent <MeshRenderer>(); if (objMR != null) { oldMaterials.Add(objMR, objMR.materials); objMR.SetToClipMaterial(); objMRs.Add(objMR); } MeshRenderer cloneMR = childClone.GetComponent <MeshRenderer>(); if (cloneMR != null) { cloneMRs.Add(cloneMR); } Collider[] cols = childClone.GetComponents <Collider>(); cloneCols.Add(cols); GameObject cloneCameraClone = childClone.Clone("in-camera-clone", CloneLayer, new System.Type[] { typeof(MeshFilter), typeof(MeshRenderer) }, true); cloneCameraClones.Add(childClone, cloneCameraClone); PlaneClipCollider objClipCol = child.gameObject.GetComponent <PlaneClipCollider>(); if (objClipCol == null) { objClipCol = child.gameObject.AddComponent <PlaneClipCollider>(); } objClipCol.enabled = true; objClipCols.Add(objClipCol); PlaneClipCollider cloneClipCol = childClone.AddComponent <PlaneClipCollider>(); cloneClipCol.enabled = true; cloneClipCols.Add(cloneClipCol); CreateCloneHirearchy(child.gameObject, childClone, CloneLayer); clonedChildren.Add(child.gameObject, childClone); } } }
public ClonedObject(GameObject original, int direction, GameObject inPortal, GameObject outPortal, int CloneLayer, List <GameObject> otherPortalClones) { _original = original; _direction = direction; _objectsInPortalCount = 1; _clone = _original.Clone("in-clone", _original.layer, new System.Type[] { typeof(MeshFilter), typeof(MeshRenderer), typeof(Collider) }, true); _clone.tag = "Inside Portal"; _clone.transform.parent = null; _otherPortalClones = otherPortalClones; clonedChildren = new Dictionary <GameObject, GameObject>(); cloneCameraClones = new Dictionary <GameObject, GameObject>(); cloneCamCloneMRs = new List <MeshRenderer>(); GameObject cloneCameraClone = _clone.Clone("in-camera-clone", CloneLayer, new System.Type[] { typeof(MeshFilter), typeof(MeshRenderer) }, true); cloneCameraClones.Add(_clone, cloneCameraClone); cloneCamCloneMRs.Add(cloneCameraClone.GetComponent <MeshRenderer>()); oldMaterials = new Dictionary <MeshRenderer, Material[]>(); objMRs = new List <MeshRenderer>(); cloneMRs = new List <MeshRenderer>(); cloneCols = new List <Collider[]>(); objClipCols = new List <PlaneClipCollider>(); cloneClipCols = new List <PlaneClipCollider>(); MeshRenderer objMR = _original.GetComponent <MeshRenderer>(); if (objMR != null) { oldMaterials.Add(objMR, objMR.materials); objMR.SetToClipMaterial(); objMRs.Add(objMR); } MeshRenderer cloneMR = _clone.GetComponent <MeshRenderer>(); if (cloneMR != null) { cloneMRs.Add(cloneMR); } Collider[] cols = _clone.GetComponents <Collider>(); cloneCols.Add(cols); objRB = _original.GetComponent <Rigidbody>(); if (_original.tag != "Player") { if (objRB != null) { objRB.mass /= 2; cloneRB = _clone.AddComponent <Rigidbody>(); cloneRB.mass = objRB.mass; cloneRB.velocity = objRB.velocity; cloneRB.angularVelocity = objRB.angularVelocity; cloneRB.useGravity = false; objRB.useGravity = false; cloneRB.isKinematic = objRB.isKinematic; cloneRB.constraints = objRB.constraints; cloneRB.TransformRigidBodyThroughPortal(inPortal, outPortal); cloneRB.ResetCenterOfMass(); cloneRB.ResetInertiaTensor(); } } else { interpolate = false; } PlaneClipCollider objClipCol = _original.GetComponent <PlaneClipCollider>(); if (objClipCol == null) { objClipCol = _original.AddComponent <PlaneClipCollider>(); } objClipCol.enabled = true; objClipCols.Add(objClipCol); PlaneClipCollider cloneClipCol = _clone.AddComponent <PlaneClipCollider>(); cloneClipCol.enabled = true; cloneClipCols.Add(cloneClipCol); CreateCloneHirearchy(_original, _clone, CloneLayer); _clone.TransformThroughPortal(inPortal, outPortal); objMRs.SetClipPlanes(outPortal, inPortal, _direction == -1); cloneMRs.SetClipPlanes(inPortal, outPortal, _direction == -1); cloneCamCloneMRs.SetClipPlanes(inPortal, outPortal, false); foreach (PlaneClipCollider clipCol in objClipCols) { clipCol.PlanePosition = inPortal.transform.position; clipCol.PlaneNormal = inPortal.transform.forward * Mathf.Sign(_direction); } foreach (PlaneClipCollider clipCol in cloneClipCols) { clipCol.PlanePosition = outPortal.transform.position; clipCol.PlaneNormal = outPortal.transform.forward * Mathf.Sign(_direction); } }