using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Serialization; public class GameManager : MonoBehaviour { // 프리팹 [Header("Prefabs")] [SerializeField] private GameObject carPrefab; [SerializeField] private GameObject roadPrefab; // UI 관련 코드 [SerializeField] private MoveButton leftMoveButton; [SerializeField] private MoveButton rightMoveButton; // 도로 오브젝트 풀 private Queue _roadPool = new Queue(); private const int RoadPoolSize = 3; // 도로 이동 private List _activeRoads = new List(); // 싱글톤 private static GameManager _instance; public static GameManager Instance { get { if(_instance == null) { _instance = FindObjectOfType(); } return _instance; } } private void Awake() { if (_instance != null && _instance != this) { Destroy(this.gameObject); } else { _instance = this; } } private void Start() { // Road 오브젝트 풀 초기화 InitializeRoadPool(); StartGame(); } private void Update() { // 활성화된 도로를 아래로 서서히 이동 foreach (var activeRoad in _activeRoads) { activeRoad.transform.Translate(Vector3.back * Time.deltaTime); } } private void StartGame() { // 도로 생성 SpawnRoad(Vector3.zero); // 자동차 생성 var carController = Instantiate(carPrefab, new Vector3(0, 0, -3f), Quaternion.identity) .GetComponent(); // left, right move button에 자동차 컨트롤 기능 적용 leftMoveButton.OnMoveButtonDown += () => carController.Move(-1f); rightMoveButton.OnMoveButtonDown += () => carController.Move(1f); } // 도로 생성 및 관리 #region 도로 생성 및 관리 /// /// 도로 오브젝트 풀 초기화 /// private void InitializeRoadPool() { for (int i = 0; i < RoadPoolSize; i++) { GameObject road = Instantiate(roadPrefab); road.SetActive(false); _roadPool.Enqueue(road); } } /// /// 도로 오브젝트 풀에서 불러와 배치하는 함수 /// public void SpawnRoad(Vector3 position) { if (_roadPool.Count > 0) { GameObject road = _roadPool.Dequeue(); road.transform.position = position; road.SetActive(true); // 활성화 된 길을 움직이기 위해 List에 저장 _activeRoads.Add(road); } else { GameObject road = Instantiate(roadPrefab, position, Quaternion.identity); _activeRoads.Add(road); } } #endregion }