using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; public class BordersWatcher : MonoBehaviour { private int maxLastValidPositionsCount = 5; private float minDistanceBetweenPositions = 4.0f; private CharacterController charController; private bool isGrounded { get { return charController.isGrounded; } } private Vector3 spawnPos; private List lastValidPositions; private Vector3? _teleportedFrom; // Use this for initialization void Start () { spawnPos = transform.position; charController = GetComponent(); lastValidPositions = new List(); InvokeRepeating("ValidateFloor", 5.0f, 1.0f); } // Update is called once per frame void Update () { if (isOutOfMap()) { TeleportBack(); } } bool isOutOfMap() { return transform.position.y < -50; } void ValidateFloor() { if (isGrounded) { while (lastValidPositions.Count >= maxLastValidPositionsCount) lastValidPositions.RemoveAt(0); if (lastValidPositions.Count > 0 || _teleportedFrom.HasValue) { Vector3 lastPos = _teleportedFrom ?? lastValidPositions.Last(); if (Vector3.Distance(lastPos, transform.position) < minDistanceBetweenPositions) return; } lastValidPositions.Add(transform.position); _teleportedFrom = null; } } void TeleportBack() { Vector3 targetPos = spawnPos; if (lastValidPositions.Count > 0) { targetPos = lastValidPositions.Last(); lastValidPositions.Remove(targetPos); } transform.position = targetPos + new Vector3(0,0.01f); _teleportedFrom = targetPos; } }