using System.Collections.Generic; using System.Linq; using Components; using Core; using UnityEngine; using Application = Core.Application; namespace Systems { public class TileManager : SystemBase { [SerializeField] private Transform spawnPoint; [SerializeField] private int visibleTiles; [SerializeField] private float tileLength; public float TileOffset => tileLength; private Queue _tiles; private PoolSystem _pool; private PoolSystem ObjectPool { get { if (_pool == null) _pool = Application.GetSystem(); return _pool; } } protected override void ReleaseReferences() { PlayerHolder.OnLoopOffsetReach -= SwapTiles; } public override void Initialize() { _tiles = new Queue(); PlayerHolder.OnLoopOffsetReach += SwapTiles; } public override void StartSystem() { GenerateTiles(); base.StartSystem(); } private void GenerateTiles() { for (var i = 0; i < visibleTiles; i++) { var tile = ObjectPool.Spawn(ObjectList.Tile, spawnPoint); tile.SetPosition(i, tileLength); _tiles.Enqueue(tile); } } private void SwapTiles() { if (_tiles.IsNullOrEmpty()) return; var currentTile = _tiles.Dequeue(); var lastTile = _tiles.LastOrDefault(); if (ReferenceEquals(lastTile, null)) return; currentTile.SetPosition(lastTile.GroundIndex + 1, tileLength); _tiles.Enqueue(currentTile); } } }