private void LateUpdate() { for (int i = 0; i < m_LptTravellers.Count; i++) { PortalTraveller traveller = m_LptTravellers[i]; Transform travTrans = traveller.transform; Vector3 offsetFromPortal = travTrans.position - m_tTransform.position; int portalSide = (int)Mathf.Sign(Vector3.Dot(offsetFromPortal, m_tTransform.forward)); int portalSideOld = (int)Mathf.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, m_tTransform.forward)); if (portalSide != portalSideOld) { Matrix4x4 m = m_tTransform.localToWorldMatrix * m_tOtherPortal.worldToLocalMatrix * m_tPlayerCamera.localToWorldMatrix; traveller.Teleport(m_tTransform, m_tOtherPortal, m.GetColumn(3), m.rotation); m_pLinkedPortal.OnTravellerEnterPortal(traveller); m_LptTravellers.RemoveAt(i); i--; } else { traveller.previousOffsetFromPortal = offsetFromPortal; } } }
////////////////////////////////////////////////////////////////////// public void OnExitTrigger(Collider localCollider, Collider externalCollider) { PortalTraveller traveller = externalCollider.GetComponentInParent <PortalTraveller>(); if (!traveller || traveller.TravellerCollider != externalCollider) { return; } if (localCollider == _physZoneA) { traveller.OnLeavePortalZone(this); } else if (localCollider == _physZoneB) { traveller.OnLeavePortalZone(this); } else if (localCollider == _portalZone) { if (_trackedTravellers.Contains(traveller)) { traveller.OnExitPortal(); } } }
////////////////////////////////////////////////////////////////////// public void OnTravellerApprochingPortal(PortalTraveller traveller) { if (!_trackedTravellers.Contains(traveller)) { _trackedTravellers.Add(traveller); } }
void HandleTravellers() { for (int i = 0; i < trackedTravellers.Count; i++) { PortalTraveller traveller = trackedTravellers[i]; Transform travellerT = traveller.transform; var m = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix; Vector3 offsetFromPortal = travellerT.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward)); // Teleport if you cross through to other side if (portalSide != portalSideOld) { var positionOld = travellerT.position; var rotOld = travellerT.rotation; traveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation); traveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld); Debug.Log("Player passed through portal"); // trigger enter/exit wont call reliably since running on fixxed update linkedPortal.OnTravellerEnterPortal(traveller); trackedTravellers.RemoveAt(i); i--; } else { traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation); // UpdateSliceParams traveller.previousOffsetFromPortal = offsetFromPortal; } } }
private void LateUpdate() { for (int i = 0; i < trackedTravellers.Count; i++) { PortalTraveller traveller = trackedTravellers[i]; Transform travellerTransform = traveller.transform; Vector3 offsetFromPortal = travellerTransform.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward)); if (portalSide != portalSideOld) { Debug.Log("PLAYER VA A VIAJAR"); Matrix4x4 m = otherPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerTransform.localToWorldMatrix; traveller.Teleport(transform, otherPortal.transform, m.GetColumn(3), m.rotation); otherPortal.OnTravellerEnterPortal(traveller); trackedTravellers.RemoveAt(i); i--; } else { traveller.previousOffsetFromPortal = offsetFromPortal; } } }
void HandleTravellers() { for (int i = 0; i < trackedTravellers.Count; i++) { PortalTraveller traveller = trackedTravellers[i]; Transform travellerT = traveller.transform; var m = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix; Vector3 offsetFromPortal = travellerT.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward)); // Teleport the traveller if it has crossed from one side of the portal to the other if (portalSide != portalSideOld) { var positionOld = travellerT.position; var rotOld = travellerT.rotation; traveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation); //Added By Me traveller.gameObject.layer = gameObject.layer; traveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld); // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs linkedPortal.OnTravellerEnterPortal(traveller); trackedTravellers.RemoveAt(i); i--; } else { traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation); //UpdateSliceParams (traveller); traveller.previousOffsetFromPortal = offsetFromPortal; } } }
void LateUpdate() { for (int i = 0; i < _trackedTravellers.Count; i++) { PortalTraveller traveller = _trackedTravellers[i]; Transform travellerT = traveller.transform; Matrix4x4 m = otherPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix; Vector3 offsetFromPortal = travellerT.position - transform.position; int portalSide = Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = Math.Sign(Vector3.Dot(traveller.prevOffsetFromPortal, transform.forward)); // Teleport the traveller if it has crossed from one side of the portal to the other if (portalSide != portalSideOld) { traveller.Teleport(transform, otherPortal.transform, m.GetColumn(3), m.rotation); // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs otherPortal.OnTravellerEnterPortal(traveller); _trackedTravellers.RemoveAt(i); i--; } else { traveller.prevOffsetFromPortal = offsetFromPortal; } } }
void UpdateSliceParams(PortalTraveller traveller) { if (traveller == null) { return; } // Calculate slice normal int side = SideOfPortal(traveller.transform.position); Vector3 sliceNormal = transform.forward * -side; Vector3 cloneSliceNormal = linkedPortal.transform.forward * side; // Calculate slice centre Vector3 slicePos = transform.position; Vector3 cloneSlicePos = linkedPortal.transform.position; // Adjust slice offset so that when player standing on other side of portal to the object, the slice doesn't clip through float sliceOffsetDst = 0; float cloneSliceOffsetDst = 0; float screenThickness = screen.transform.localScale.z; bool playerSameSideAsTraveller = SameSideOfPortal(playerCam.transform.position, traveller.transform.position); if (!playerSameSideAsTraveller) { sliceOffsetDst = -screenThickness; } bool playerSameSideAsCloneAppearing = side != linkedPortal.SideOfPortal(playerCam.transform.position); if (!playerSameSideAsCloneAppearing) { cloneSliceOffsetDst = -screenThickness; } // Apply parameters for (int i = 0; i < traveller.OriginalMaterials.Length; i++) { traveller.OriginalMaterials[i].SetVector("sliceCentre", slicePos); traveller.OriginalMaterials[i].SetVector("sliceNormal", sliceNormal); traveller.OriginalMaterials[i].SetFloat("sliceOffsetDst", sliceOffsetDst); traveller.CloneMaterials[i].SetVector("sliceCentre", cloneSlicePos); traveller.CloneMaterials[i].SetVector("sliceNormal", cloneSliceNormal); traveller.CloneMaterials[i].SetFloat("sliceOffsetDst", cloneSliceOffsetDst); } if (traveller.GraphicsObject2 != null) { for (int i2 = 0; i2 < traveller.OriginalMaterials2.Length; i2++) { traveller.OriginalMaterials2[i2].SetVector("sliceCentre", slicePos); traveller.OriginalMaterials2[i2].SetVector("sliceNormal", sliceNormal); traveller.OriginalMaterials2[i2].SetFloat("sliceOffsetDst", sliceOffsetDst); traveller.CloneMaterials2[i2].SetVector("sliceCentre", cloneSlicePos); traveller.CloneMaterials2[i2].SetVector("sliceNormal", cloneSliceNormal); traveller.CloneMaterials2[i2].SetFloat("sliceOffsetDst", cloneSliceOffsetDst); } } }
void OnTriggerEnter(Collider other) { PortalTraveller traveller = other.GetComponent <PortalTraveller>(); if (traveller) { OnTravellerEnterPortal(traveller); } }
private void OnTravellerEnterPortal(PortalTraveller pTraveller) { if (!m_LptTravellers.Contains(pTraveller)) { pTraveller.EnterPortalThreshold(); pTraveller.previousOffsetFromPortal = pTraveller.transform.position - m_tTransform.position; m_LptTravellers.Add(pTraveller); } }
void OnTravellerEnterPortal(PortalTraveller traveller) { if (!trackedTravellers.Contains(traveller)) { traveller.EnterPortalThreshold(); traveller.PreviousOffsetFromPortal = traveller.transform.position - transform.position; trackedTravellers.Add(traveller); } }
void OnTriggerExit(Collider other) { PortalTraveller traveller = other.GetComponent <PortalTraveller>(); if (traveller && _trackedTravellers.Contains(traveller)) { traveller.ExitPortalTreshold(); _trackedTravellers.Remove(traveller); } }
void OnTravellerEnterPortal(PortalTraveller traveller) { if ((!differentEyePortal.trackedTravellers.Contains(traveller)) && (!trackedTravellers.Contains(traveller))) { traveller.EnterPortalThreshold(); traveller.previousOffsetFromPortal = traveller.transform.position - transform.position; trackedTravellers.Add(traveller); //Debug.Log("Add " + traveller.gameObject.name + " to " + gameObject.name); } }
void HandleTravellers() { for (int i = 0; i < trackedTravellers.Count; i++) { PortalTraveller traveller = trackedTravellers[i]; Transform travellerT = traveller.transform; var m = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix; Vector3 offsetFromPortal = travellerT.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward)); // Teleport the traveller if it has crossed from one side of the portal to the other if (portalSide != portalSideOld) { //traveller.GetComponent<Rigidbody>().velocity = linkedPortal.transform.rotation // * (Quaternion.Inverse(transform.rotation) // * traveller.GetComponent<Rigidbody>().velocity); //Physics.gravity = linkedPortal.transform.rotation * GM.initialGrav; //GM.Dir = linkedPortal.directionIndex; //Physics.gravity = transform.rotation * Physics.gravity; var positionOld = travellerT.position; var rotOld = travellerT.rotation; traveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation); traveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld); // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs if (traveller.gameObject.layer == 9 || traveller.gameObject.layer == 10) { if (traveller.gameObject.layer == 9) { Physics.gravity = travellerT.rotation * GM.initialGrav; } traveller.GetComponent <Rigidbody>().velocity = travellerT.rotation * (Quaternion.Inverse(rotOld) * traveller.GetComponent <Rigidbody>().velocity); } linkedPortal.OnTravellerEnterPortal(traveller); trackedTravellers.RemoveAt(i); i--; } else { //Physics.gravity = linkedPortal.transform.rotation * Physics.gravity; traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation); //UpdateSliceParams (traveller); traveller.previousOffsetFromPortal = offsetFromPortal; } } }
private void OnTriggerExit(Collider other) { PortalTraveller travel = other.GetComponent <PortalTraveller>(); if (travel == null) { return; } travel.ExitPortal(this); }
// instantiate model clone for slicingv void OnTravellerEnterPortal(PortalTraveller traveller) { if (!trackedTravellers.Contains(traveller)) { Debug.Log("player entered portal"); //player.enabled = false; traveller.EnterPortalThreshold(); traveller.previousOffsetFromPortal = traveller.transform.position - transform.position; trackedTravellers.Add(traveller); } }
private void OnTriggerStay(Collider other) { PortalTraveller travel = other.GetComponent <PortalTraveller>(); if (travel == null) { return; } travel.AttemptTeleport(); }
void OnTravellerEnterPortal(PortalTraveller traveller) { if (!trackedTravellers.Contains(traveller)) { traveller.EnterPortalThreshold(); traveller.previousOffsetFromPortal = traveller.transform.position - transform.position; trackedTravellers.Add(traveller); Physics.IgnoreCollision(traveller.GetComponent <Collider>(), embeddedWall, true); } }
private void OnTriggerEnter(Collider other) { PortalTraveller travel = other.GetComponent <PortalTraveller>(); if (travel == null) { return; } //entering the entrance portal travel.EnterPortal(this); }
void OnTravellerEnterPortal(PortalTraveller traveller) { //Debug.Log(gameObject.name); //Debug.Log("Traveller in"); if (!trackedTravellers.Contains(traveller)) { //Debug.Log("Traveller ADDED"); traveller.EnterPortalThreshold(); traveller.previousOffsetFromPortal = traveller.transform.position - transform.position; trackedTravellers.Add(traveller); } }
// Use custom projection matrix to align portal camera's near clip plane with the surface of the portal // Note that this affects precision of the depth buffer, which can cause issues with effects like screenspace AO void OnTravellerEnterPortal(PortalTraveller traveller) { if (!trackedTravellers.Contains(traveller)) { if (linkedPortal.linkedPortal != this) { linkedPortal.linkedPortal = this; } traveller.EnterPortalThreshold(); traveller.previousOffsetFromPortal = traveller.transform.position - transform.position; trackedTravellers.Add(traveller); } }
void UpdateSliceParams(PortalTraveller traveller) { // Calculate slice normal int side = SideOfPortal(playerCam.transform.position); Vector3 sliceNormal = transform.forward * -side; Vector3 cloneSliceNormal = linkedPortal.transform.forward * side; // Calculate slice centre Vector3 slicePos = transform.position; Vector3 cloneSlicePos = linkedPortal.transform.position; // Adjust slice offset so that when player standing on other side of portal to the object, the slice doesn't clip through float sliceOffsetDst = 0; float cloneSliceOffsetDst = 0; float screenThickness = screen.transform.localScale.z; bool playerSameSideAsTraveller; if (traveller.tag != "Player") { playerSameSideAsTraveller = SameSideOfPortal(playerCam.transform.position, traveller.transform.position); } else { playerSameSideAsTraveller = SameSideOfPortal(playerCam.transform.position, traveller.transform.GetChild(0).GetChild(0).position); } if (!playerSameSideAsTraveller) { sliceOffsetDst = -screenThickness; } bool playerSameSideAsCloneAppearing = side != linkedPortal.SideOfPortal(playerCam.transform.position); if (!playerSameSideAsCloneAppearing) { cloneSliceOffsetDst = -screenThickness; } // Apply parameters for (int j = 0; j < traveller.originalMaterials.Length; j++) { traveller.originalMaterials[j].SetVector("sliceCentre", slicePos); traveller.originalMaterials[j].SetVector("sliceNormal", sliceNormal); traveller.originalMaterials[j].SetFloat("sliceOffsetDst", sliceOffsetDst); traveller.cloneMaterials[j].SetVector("sliceCentre", cloneSlicePos); traveller.cloneMaterials[j].SetVector("sliceNormal", cloneSliceNormal); traveller.cloneMaterials[j].SetFloat("sliceOffsetDst", cloneSliceOffsetDst); } }
void HandleTravellers() { for (int i = 0; i < trackedTravellers.Count; i++) { PortalTraveller traveller = trackedTravellers[i]; Transform travellerT = traveller.transform; var m = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * getTransfParent(travellerT, traveller.deepParentScript).localToWorldMatrix; Vector3 offsetFromPortal = travellerT.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward)); // Teleport the traveller if it has crossed from one side of the portal to the other if ((portalSide != portalSideOld) /*&&(traveller.readyToTeleport)*/) { for (int j = 0; j < trackedTravellers.Count; j++) { Debug.Log(trackedTravellers[j].gameObject.name + " " + j); } /* Debug.Log("Linked " + linkedPortal.transform.localToWorldMatrix.GetColumn(0) + " " + linkedPortal.transform.localToWorldMatrix.GetColumn(1) + " " + linkedPortal.transform.localToWorldMatrix.GetColumn(2) + " " + linkedPortal.transform.localToWorldMatrix.GetColumn(3)); * Debug.Log("portal world " + transform.localToWorldMatrix.GetColumn(0) + " " + transform.localToWorldMatrix.GetColumn(1) + " " + transform.localToWorldMatrix.GetColumn(2) + " " + transform.localToWorldMatrix.GetColumn(3)); * Debug.Log("portal " + transform.worldToLocalMatrix.GetColumn(0) + " " + transform.worldToLocalMatrix.GetColumn(1) + " " + transform.worldToLocalMatrix.GetColumn(2) + " " + transform.worldToLocalMatrix.GetColumn(3)); * * Debug.Log("traveller " + travellerT.transform.localToWorldMatrix.GetColumn(0) + " " + travellerT.transform.localToWorldMatrix.GetColumn(1) + " " + travellerT.transform.localToWorldMatrix.GetColumn(2) + " " + travellerT.transform.localToWorldMatrix.GetColumn(3)); * Debug.Log("all " + m.GetColumn(0) + " " + m.GetColumn(1) + " " + m.GetColumn(2) + " " + m.GetColumn(3)); * Debug.Log("Matrix" + m.GetColumn(3));*/ var positionOld = getTransfParent(travellerT, traveller.deepParentScript).position; var rotOld = getTransfParent(travellerT, traveller.deepParentScript).rotation; PortalTraveller newtraveller = traveller; if (getTransfParent(travellerT, traveller.deepParentScript).GetComponent <PortalTraveller>() != null) { newtraveller = getTransfParent(travellerT, traveller.deepParentScript).GetComponent <PortalTraveller>(); } newtraveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation); newtraveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld); // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs linkedPortal.OnTravellerEnterPortal(traveller); trackedTravellers.RemoveAt(i); i--; } else { traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation); //UpdateSliceParams (traveller); /*if (traveller.readyToTeleport)*/ traveller.previousOffsetFromPortal = offsetFromPortal; } } }
void HandleTravellers() { for (int i = 0; i < trackedTravellers.Count; i++) { PortalTraveller traveller = trackedTravellers[i]; Transform travellerT = traveller.transform; if (!traveller.gameObject.activeSelf || !traveller.collider.bounds.Intersects(collider.bounds)) { traveller.ExitPortalThreshold(); trackedTravellers.Remove(traveller); i--; continue; } var m = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix; Vector3 offsetFromPortal = travellerT.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward)); // Teleport the traveller if it has crossed from one side of the portal to the other if (portalSide != portalSideOld) { var positionOld = travellerT.position; var rotOld = travellerT.rotation; traveller.Teleport(transform, traveller.graphicsClone.transform, m.GetColumn(3), m.rotation, m); traveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld); traveller.graphicsClone.transform.localScale = MyFunc.Div(transform.lossyScale, linkedPortal.transform.lossyScale); // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs linkedPortal.OnTravellerEnterPortal(traveller); trackedTravellers.RemoveAt(i); i--; Portal temp = linkedPortal; if (portalController != null) { portalController.OnOutFromPortal(linkedPortal); } if (temp.portalController != null) { temp.portalController.OnComeToPortal(this); } } else { traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation); traveller.graphicsClone.transform.localScale = MyFunc.Div(m.lossyScale, travellerT.transform.lossyScale); traveller.previousOffsetFromPortal = offsetFromPortal; } } }
void OnTravellerEnterPortal(PortalTraveller traveller) { if (!trackedTravellers.Contains(traveller)) { traveller.EnterPortalThreshold(); Transform tempTraveller; tempTraveller = traveller.transform; if (traveller.tag != "Player") { traveller.previousOffsetFromPortal = tempTraveller.position - transform.position; } else { traveller.previousOffsetFromPortal = tempTraveller.GetChild(0).GetChild(0).position - transform.position; } trackedTravellers.Add(traveller); } }
void UpdateSliceParams(PortalTraveller traveller) { // calculate slice normal int side = SideOfPortal(traveller.transform.position); Vector3 sliceNormal = transform.forward * -side; Vector3 cloneSliceNormal = linkedPortal.transform.forward * side; // calculate slice position Vector3 slicePos = transform.position; Vector3 cloneSlicePos = linkedPortal.transform.position; // Adjust slice offset so when player is standing on other side of portal to an object thatisslicing, the slice doesn't clip through float sliceOffsetDst = 0; float cloneSliceOffsetDst = 0; float screenThickness = screen.transform.localScale.z; bool playerSameSideAsTraveller = SameSideOfPortal(playerCam.transform.position, traveller.transform.position); if (!playerSameSideAsTraveller) { sliceOffsetDst = -screenThickness; } bool playerSameSideAsCloneAppearing = side != linkedPortal.SideOfPortal(playerCam.transform.position); if (!playerSameSideAsCloneAppearing) { cloneSliceOffsetDst = -screenThickness; } // apply slice parameters for (int i = 0; i < traveller.originalMaterials.Length; i++) { traveller.originalMaterials[i].SetVector("sliceCentre", slicePos); traveller.originalMaterials[i].SetVector("sliceNormal", sliceNormal); traveller.originalMaterials[i].SetFloat("sliceOffsetDst", sliceOffsetDst); traveller.cloneMaterials[i].SetVector("sliceCentre", cloneSlicePos); traveller.cloneMaterials[i].SetVector("sliceNormal", cloneSliceNormal); traveller.cloneMaterials[i].SetFloat("sliceOffsetDst", cloneSliceOffsetDst); } }
////////////////////////////////////////////////////////////////////// private void UpdateTravellers() { for (int i = _trackedTravellers.Count - 1; i >= 0; --i) { PortalTraveller traveller = _trackedTravellers[i]; if (traveller.IsInPortal) { Matrix4x4 relativeMat = _linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * traveller.transform.localToWorldMatrix; if (traveller.HasCrossedPortal(this)) { traveller.Teleport(relativeMat.GetColumn(3), relativeMat.rotation); _linkedPortal.OnTravellerApprochingPortal(traveller); OnTravellerLeavingPortal(traveller); } else { traveller.UpdateClone(relativeMat.GetColumn(3), relativeMat.rotation); } } } }
////////////////////////////////////////////////////////////////////// public void OnEnterTrigger(Collider localCollider, Collider externalCollider) { PortalTraveller traveller = externalCollider.GetComponentInParent <PortalTraveller>(); if (!traveller || traveller.TravellerCollider != externalCollider) { return; } if (localCollider == _physZoneA) { traveller.OnApproachPortalZone(this, GlobalVars.Instance._layerPortalSideA, GlobalVars.Instance._layerPortalSideB); } else if (localCollider == _physZoneB) { traveller.OnApproachPortalZone(this, GlobalVars.Instance._layerPortalSideB, GlobalVars.Instance._layerPortalSideA); } else if (localCollider == _portalZone) { traveller.OnEnterPortal(); } }
void HandleTravellers() { for (int i = 0; i < trackedTravellers.Count; i++) { // set traveller and traveller transform PortalTraveller traveller = trackedTravellers[i]; Transform travellerT = traveller.transform; var m = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix; // calculate offset from portal from the traveller transform to the portals transform Vector3 offsetFromPortal = travellerT.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward)); // Teleport Traveller if it has crossed one side of the portal to the other if (portalSide != portalSideOld) // check the portal side isnt the old side { //Debug.Log("You have entered the portal"); // traveller can teleport traveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation); // Can't rely on OnTriggerExit to remove tracked traveller next frame since it's // dependent on when fixed update is next called linkedPortal.OnTravellerEnterPortal(traveller); trackedTravellers.RemoveAt(i); i--; } else { // if portal side is same as old portal side set previous offset equal to offset traveller.previousOffsetFromPortal = offsetFromPortal; } } }
void HandleTravellers() { for (int i = 0; i < trackedTravellers.Count; i++) { PortalTraveller traveller = trackedTravellers[i]; if (traveller == null) // debugdestroy { continue; } if (traveller.GraphicsObject2 == null) // model 2 not here { Transform travellerT = traveller.transform; Transform model1T = traveller.GraphicsObject.transform; var t = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix; var m1 = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * model1T.localToWorldMatrix; Vector3 offsetFromPortal = travellerT.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.PreviousOffsetFromPortal, transform.forward)); // Teleport the traveller if it has crossed from one side of the portal to the other if (portalSide != portalSideOld) { var positionOld = model1T.position; var rotOld = model1T.rotation; if (traveller.GetComponent <PhysicsObject>()) { traveller.GetComponent <PhysicsObject>().Drop(); /*if (traveller.GetComponent<PhysicsObject>().m_Held) * { * GameObject mtraveller = traveller.GetComponent<PhysicsObject>().playercontroller.GetComponent<FPSWeapon>().m_HandTransform.gameObject; * Transform mtravellerT = mtraveller.transform; * var mt = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * mtravellerT.localToWorldMatrix; * * var mpositionOld = model1T.position; * var mrotOld = model1T.rotation; * * traveller.Teleport(transform, linkedPortal.transform, mt.GetColumn(3), mt.rotation); * traveller.GraphicsClone.transform.SetPositionAndRotation(mpositionOld, mrotOld); * }*/ } /*else * { * traveller.Teleport(transform, linkedPortal.transform, t.GetColumn(3), t.rotation); * traveller.GraphicsClone.transform.SetPositionAndRotation(positionOld, rotOld); * }*/ traveller.Teleport(transform, linkedPortal.transform, t.GetColumn(3), t.rotation); traveller.GraphicsClone.transform.SetPositionAndRotation(positionOld, rotOld); // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs linkedPortal.OnTravellerEnterPortal(traveller); trackedTravellers.RemoveAt(i); i--; } else { traveller.GraphicsClone.transform.SetPositionAndRotation(m1.GetColumn(3), m1.rotation); traveller.PreviousOffsetFromPortal = offsetFromPortal; } } else // model 2 is here { Transform travellerT = traveller.transform; Transform model1T = traveller.GraphicsObject.transform; Transform model2T = traveller.GraphicsObject2.transform; var t = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix; var m1 = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * model1T.localToWorldMatrix; var m2 = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * model2T.localToWorldMatrix; Vector3 offsetFromPortal = travellerT.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.PreviousOffsetFromPortal, transform.forward)); // Teleport the traveller if it has crossed from one side of the portal to the other if (portalSide != portalSideOld) { var positionOld = model1T.position; var rotOld = model1T.rotation; var positionOld2 = model2T.position; var rotOld2 = model2T.rotation; if (traveller.GetComponent <PhysicsObject>()) { traveller.GetComponent <PhysicsObject>().Drop(); } traveller.Teleport(transform, linkedPortal.transform, t.GetColumn(3), t.rotation); traveller.GraphicsClone.transform.SetPositionAndRotation(positionOld, rotOld); traveller.GraphicsClone2.transform.SetPositionAndRotation(positionOld2, rotOld2); // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs linkedPortal.OnTravellerEnterPortal(traveller); trackedTravellers.RemoveAt(i); i--; } else { traveller.GraphicsClone.transform.SetPositionAndRotation(m1.GetColumn(3), m1.rotation); traveller.GraphicsClone2.transform.SetPositionAndRotation(m2.GetColumn(3), m2.rotation); traveller.PreviousOffsetFromPortal = offsetFromPortal; } } } }