UnityGameProjectsCode / Rise2Point0Game / Player / SlowMotionAbility.cs
SlowMotionAbility.cs
Raw
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);
            }
        }
    }


}