using System.Linq; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Scripting.APIUpdating; public enum TrackObstacleType { Stopper = 0, NonMovableTrain = 1, MovableTrain = 2, MAX = 3, } public class ObstaclesManager : MonoBehaviour, IBase, IBootLoader, IDataLoader { [SerializeField] private ObstaclesPathSO obstaclesPathSO; [SerializeField] private Transform obstacleEndpoint; [SerializeField] private float movableTrainSpeed; [SerializeField] private float movableTrainMinSpeed = 30f; [SerializeField] private float movableTrainMaxSpeed = 45f; private ObjectPoolManager objectPoolManager; private WorldSpawnManager worldSpawnManager; private PlayerCarController playerCarController; public GameManager GameManager { get; private set; } public ObstaclesPathSO ObstaclesPathSO => obstaclesPathSO; public Vector3 ObstacleEndpoint => obstacleEndpoint.position; public TrackObstacleType CurrentTrackObstacleType { get; private set; } public float MovableTrainSpeed => GameManager.IsGameInProgress ? worldSpawnManager.GetResultBasedOnDifficultyProgressiveFormula(startVal: movableTrainMinSpeed, endVal: movableTrainMaxSpeed, fraction: playerCarController.CurrentEvaluatedSpeed01) : 0; public void Initialize() { InterfaceManager.Instance?.RegisterInterface(this); } public void InitializeData() { GameManager = InterfaceManager.Instance?.GetInterfaceInstance(); objectPoolManager = InterfaceManager.Instance?.GetInterfaceInstance(); worldSpawnManager = InterfaceManager.Instance?.GetInterfaceInstance(); playerCarController = InterfaceManager.Instance?.GetInterfaceInstance(); } public void SpawnObstacle(Vector3 laneSpawnStartPos, out ObstacleBase obstacleBase) { ObstacleBase poolInstance = objectPoolManager.GetObjectFromPool($"{CurrentTrackObstacleType}", GetPoolType()); poolInstance.transform.position = laneSpawnStartPos; poolInstance.gameObject.SetActive(true); obstacleBase = poolInstance; } public void SendObjectToPool(ObstacleBase obstacleBase) { objectPoolManager.PassObjectToPool($"{obstacleBase.ObstacleType}", GetPoolType(), obstacleBase); } public PoolType GetPoolType() { switch (CurrentTrackObstacleType) { case TrackObstacleType.MovableTrain: return PoolType.Movable; case TrackObstacleType.NonMovableTrain: return PoolType.NonMovable; case TrackObstacleType.Stopper: return PoolType.Obstacle; default: return PoolType.MAX; } } public void SendAllObjectsToPool() { var obstacleBases = FindObjectsOfType(); Debug.Log($"bases Count: {obstacleBases.Length}"); foreach (var obstacleBase in obstacleBases) { obstacleBase.gameObject.SetActive(false); SendObjectToPool(obstacleBase); } } public void SetObstaclesType(bool isInitialSpawn) { CurrentTrackObstacleType = (TrackObstacleType)(isInitialSpawn ? UnityEngine.Random.Range(0, (int)TrackObstacleType.MovableTrain) : UnityEngine.Random.Range(0, (int)TrackObstacleType.MAX)); } }