Esempio n. 1
0
    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);
            }
        }
    }
Esempio n. 2
0
    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);
        }
    }