public void OnTriggerExit(Collider other) { PortalTraveler portalTraveler = other.GetComponent <PortalTraveler>(); if (portalTraveler != null) { if (other.CompareTag("Player")) { playerTraveler = null; var originalPosition = new Vector3(0, portalDisplay.transform.localPosition.y, 0); PortalAdjustment(originalPosition, originalPortalScale); target.PortalAdjustment(originalPosition, originalPortalScale); } else { Sliceable sliceable = portalTraveler.GetComponent <Sliceable>(); sliceable.IsSliceable = false; sliceable.UpdateMaterialSlice(); TransformToTarget(portalTraveler.transform); lstPortalTravelers.Remove(portalTraveler); DestroyTravelerCopy(portalTraveler); travelerCopies.Remove(portalTraveler); } } }
public void OnTriggerEnter(Collider other) { PortalTraveler portalTraveler = other.GetComponent <PortalTraveler>(); if (portalTraveler != null && portalTraveler.enabled) { var playerVecFromPortal = other.transform.position - transform.position; enteredFromBack = Vector3.Dot(playerVecFromPortal, transform.forward) < 0; if (other.CompareTag("Player")) { playerTraveler = portalTraveler; var localPosition = portalDisplay.transform.localPosition; var portalAdjustment = (enteredFromBack ? 1 : -1) * (portalDisplayExpandFactor * 0.1f / 2f); var portalScale = new Vector3(portalDisplayExpandFactor, originalPortalScale.y, originalPortalScale.z); var portalPosition = new Vector3(localPosition.x, localPosition.y, portalAdjustment); PortalAdjustment(portalPosition, portalScale); } else { CreateTravelerClone(portalTraveler, enteredFromBack); } } }
private void CreateTravelerClone(PortalTraveler portalTraveler, bool enteredFromBack) { lstPortalTravelers.Add(portalTraveler); TransformToTarget(portalTraveler.transform, out Vector3 newPos, out Quaternion newRot); PortalTraveler travelerCopy = Instantiate(portalTraveler, newPos, newRot); travelerCopy.enabled = false; SimpleMove simpleMoveComponent = travelerCopy.GetComponent <SimpleMove>(); if (simpleMoveComponent) { simpleMoveComponent.enabled = false; } Sliceable sliceable = portalTraveler.GetComponent <Sliceable>(); sliceable.SlicePosition = transform.position; sliceable.SliceNormal = transform.forward; sliceable.IsSliceable = true; sliceable.Flip = !enteredFromBack; sliceable.UpdateMaterialSlice(); if (target) { sliceable = travelerCopy.GetComponent <Sliceable>(); sliceable.SlicePosition = target.transform.position; sliceable.SliceNormal = target.transform.forward; sliceable.IsSliceable = true; sliceable.Flip = enteredFromBack; sliceable.UpdateMaterialSlice(); } travelerCopies.Add(portalTraveler, travelerCopy.gameObject); }
private bool CheckTravelerPassPortal(PortalTraveler traveler) { Vector3 forward = transform.forward; Vector3 previousVec = traveler.LastFramePosition - transform.position; Vector3 currentVec = traveler.transform.position - transform.position; float previousSign = Mathf.Sign(Vector3.Dot(previousVec, forward)); float currentSign = Mathf.Sign(Vector3.Dot(currentVec, forward)); return(previousSign + currentSign == 0); }
private void DestroyTravelerCopy(PortalTraveler traveler) { if (travelerCopies != null && travelerCopies.ContainsKey(traveler)) { GameObject clone = travelerCopies[traveler]; if (clone != null) { Destroy(clone); } } }
void OnTravelerEnterPortal(PortalTraveler traveler) { // Check if traveler is already being tracked if (!trackedTravelers.Contains(traveler)) { traveler.EnterPortalThreshold(); // if traveler is viewer use camera transform if (traveler.isViewer) { traveler.previousOffsetFromPortal = playerCam.transform.position - transform.position; } else { traveler.previousOffsetFromPortal = traveler.transform.position - transform.position; } trackedTravelers.Add(traveler); //Debug.Break(); //Debug.Log("Travel added to portal list"); } }
void HandleTravellers() { for (int i = 0; i < trackedTravelers.Count; i++) { PortalTraveler traveler = trackedTravelers[i]; Transform travelerT = traveler.transform; // if traveler is viewer use camera transform Transform offsetTransform = (traveler.isViewer) ? playerCam.transform : traveler.transform; var m = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travelerT.localToWorldMatrix; Vector3 offsetFromPortal = offsetTransform.position - transform.position; int portalSide = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward)); int portalSideOld = System.Math.Sign(Vector3.Dot(traveler.previousOffsetFromPortal, transform.forward)); // Teleport traveler if crossed from one side of portal to other if (portalSide != portalSideOld) { var positionOld = travelerT.position; var rotOld = travelerT.rotation; traveler.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation); traveler.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld); //Debug.Log("Travel teleports"); //Debug.Break(); linkedPortal.OnTravelerEnterPortal(traveler); trackedTravelers.RemoveAt(i); i--; } else { traveler.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation); traveler.previousOffsetFromPortal = offsetFromPortal; } } }