using System.Collections.Generic; using System.Linq; using UnityEngine; public class SlowMotionAbility : MonoBehaviour { //when active, search for obstacles within a given range //if an obstacle is in close proximity, enable slow motion //To enable slow motion, change the time scale to a lower value //once outside of the obstacles proximity, revert to normal time //need to be able to track multiple obstacles if in proximity to more than one //slow motion should only stop once outside proximity of all obstacles private List<GameObject> obstaclesInRange = new List<GameObject>(); private List<GameObject> obstaclesInProximity = new List<GameObject>(); public float proximityRange; //range for turning on slow motion public float searchRange; //range for searching for obstacles private void Update() { SearchForObstacles(); SearchForObstaclesInProximity(); RemoveOldObstacles(); SetSlowMotionState(); } public void SearchForObstacles() { Collider2D[] hitColliders = Physics2D.OverlapCircleAll(transform.position, searchRange); foreach (Collider2D item in hitColliders) { if (item.name.Contains("Obstacle")) { obstaclesInRange.Add(item.gameObject); obstaclesInRange = obstaclesInRange.Distinct().ToList(); } } } public void SearchForObstaclesInProximity() { foreach (GameObject item in obstaclesInRange) { if (Vector2.Distance(transform.position, item.GetComponent<Collider2D>().ClosestPoint(transform.position)) <= proximityRange) { obstaclesInProximity.Add(item); obstaclesInProximity = obstaclesInProximity.Distinct().ToList(); } } } public void SetSlowMotionState() { if (Time.timeScale == 1f && obstaclesInProximity.Count > 0) Time.timeScale = 0.35f; if (Time.timeScale == 0.35f && obstaclesInProximity.Count == 0) Time.timeScale = 1f; } public void ClearObstaclesList() { obstaclesInRange.Clear(); } public void RemoveOldObstacles() { for (int i = obstaclesInRange.Count - 1; i >= 0; i--) { if (Vector2.Distance(transform.position, obstaclesInRange[i].transform.position) > searchRange) { obstaclesInRange.RemoveAt(i); } } for (int i = obstaclesInProximity.Count - 1; i >= 0; i--) { if (Vector2.Distance(transform.position, obstaclesInProximity[i].transform.position) > proximityRange) { obstaclesInProximity.RemoveAt(i); } } } }