IEnumerator Teleport(Teleportee teleportee) { if (teleportee.root == Snake.instance.trs) { bool done = false; int hitColliderIndex = 0; while (!done) { for (int i = 1; i < Snake.instance.verticies.Count; i++) { toEndPortal = endPortal.transform.position - transform.position; while (Physics2D.Linecast(Snake.instance.GetVertexPosition(i) + toEndPortal, Snake.instance.GetVertexPosition(i - 1) + toEndPortal, Snake.instance.whatICrashInto).collider != null) { hitColliderIndex = i; yield return(new WaitForFixedUpdate()); } } if (hitColliderIndex > 0) { bool hitAnotherCollider = false; for (int i = 1; i < hitColliderIndex; i++) { if (Physics2D.Linecast(Snake.instance.GetVertexPosition(i) + toEndPortal, Snake.instance.GetVertexPosition(i - 1) + toEndPortal, Snake.instance.whatICrashInto).collider != null) { hitAnotherCollider = true; break; } } if (!hitAnotherCollider) { done = true; } } else { done = true; } } Snake.instance.trs.position += (Vector3)toEndPortal; } else { } }
void OnTriggerExit2D(Collider2D other) { Transform otherTrs = other.transform.root; for (int i = 0; i < tryingToTeleport.Count; i++) { Teleportee teleportee = tryingToTeleport[i]; if (teleportee.root == otherTrs) { if (teleportee.justTeleported) { if (teleportee.teleportRoutine != null) { StopCoroutine(teleportee.teleportRoutine); } teleportee.justTeleported = false; } return; } } }
void OnTriggerEnter2D(Collider2D other) { Transform otherTrs = other.transform.root; foreach (Teleportee teleportee in tryingToTeleport) { if (teleportee.root == otherTrs) { if (!teleportee.justTeleported) { teleportee.justTeleported = true; teleportee.teleportRoutine = StartCoroutine(Teleport(teleportee)); } return; } } Teleportee _teleportee = new Teleportee(); _teleportee.root = otherTrs; _teleportee.teleportRoutine = StartCoroutine(Teleport(_teleportee)); tryingToTeleport.Add(_teleportee); }