void Setup() { //this would be the Start method, but I need the portal's Start() method to run first shortS = shortTunnelSouthPortal.Find("cameraContainer").Find("camera").GetComponent <portalCamMovement>(); shortN = shortTunnelNorthPortal.Find("cameraContainer").Find("camera").GetComponent <portalCamMovement>(); longS = longTunnelSouthPortal.Find("cameraContainer").Find("camera").GetComponent <portalCamMovement>(); longN = longTunnelNorthPortal.Find("cameraContainer").Find("camera").GetComponent <portalCamMovement>(); RecalculateOffset(!playerBeginsOutsideLongTunnel); setupComplete = true; //subscription to public event portalEvents.teleport += somethingTeleported; }
void Start() { //if not provided, use default values if (playerCamera == null) { playerCamera = Camera.main.transform; } if (groupId == "") { groupId = transform.name; } //reference to each portal of this set portalA = transform.GetChild(0); portalB = transform.GetChild(1); //I generate containers for cameras (for pivot points) GameObject containerCamA = new GameObject("cameraContainer"); GameObject containerCamB = new GameObject("cameraContainer"); //and put them inside each portal containerCamA.transform.SetParent(portalA, true); containerCamB.transform.SetParent(portalB, true); //I generate the empty objects for the cameras GameObject objCamA = new GameObject("camera"); GameObject objCamB = new GameObject("camera"); //and put them inside the containers. objCamA.transform.SetParent(containerCamA.transform, true); objCamB.transform.SetParent(containerCamB.transform, true); // (now we have portal>container>empty-obj-camera) //add camera components to the cameras cameraA = objCamA.AddComponent <Camera>(); cameraB = objCamB.AddComponent <Camera>(); //and its scripts portalCamMovement scriptCamA = cameraA.gameObject.AddComponent <portalCamMovement>(); portalCamMovement scriptCamB = cameraB.gameObject.AddComponent <portalCamMovement>(); //I give this new cameras same setup than main camera Camera cameraComp = playerCamera.GetComponent <Camera>(); cameraA.CopyFrom(cameraComp); cameraB.CopyFrom(cameraComp); //I setup both camera's scripts scriptCamA.playerCamera = playerCamera; scriptCamA.thisPortal = portalA; scriptCamA.otherPortal = portalB; scriptCamA.clippingOffset = advanced.clippingOffset; scriptCamA.cameraId = groupId + ".a"; scriptCamB.playerCamera = playerCamera; scriptCamB.thisPortal = portalB; scriptCamB.otherPortal = portalA; scriptCamB.clippingOffset = advanced.clippingOffset; scriptCamB.cameraId = groupId + ".b"; //and setup both portal's script teleport scriptPortalA = portalA.Find("plane").GetComponent <teleport>(); teleport scriptPortalB = portalB.Find("plane").GetComponent <teleport>(); scriptPortalA.setup = this; scriptPortalA.cameraScript = scriptCamA; scriptPortalA.otherScript = scriptPortalB; scriptPortalB.setup = this; scriptPortalB.cameraScript = scriptCamB; scriptPortalB.otherScript = scriptPortalA; //I create materials with the shader //and asign those materials to the planes (here is where they cross) Resize(false); setupComplete = true; portalEvents.setupComplete?.Invoke(groupId, transform); }