using System.Collections.Generic; using Cysharp.Threading.Tasks; using System; using System.Linq; using UnityEngine; using UnityEngine.SceneManagement; using EnglewoodLAB.UI; using EnglewoodLAB.Command; using EnglewoodLAB.Object; using EnglewoodLAB.Constants; using EnglewoodLAB.Management; namespace EnglewoodLAB.UI { public class CameraControlPanel : UIPanel { public List cameraViewPoints = new List(); private readonly List cameraButtons = new List(); public CameraControlItem cameraControlItem; private CameraControlItem selectedCameraControlItem; public bool isSceneReady; private void Awake() { IgnoreSingleOpenMode = true; } public override async UniTask Init() { cameraControlItem = Resources.Load($"{ResourceURL.UIPrefabFolderPath}CameraControlItem"); SceneManager.sceneLoaded += OnSceneLoaded; //ÀÌ¹Ì ·ÎµåµÈ Ãʱ⠾À ¼öµ¿ ó¸® RefreshCameraPoints(); gameObject.SetActive(false); await UniTask.CompletedTask; } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { RefreshCameraPoints(); } private void RefreshCameraPoints() { cameraViewPoints = FindObjectsByType(FindObjectsSortMode.None).OrderBy(cp => cp.transform.GetSiblingIndex()).ToList(); isSceneReady = cameraViewPoints == null || cameraViewPoints.Count == 0 ? false : true; SettingButtons(); if (selectedCameraControlItem != null) { Debug.Log(selectedCameraControlItem.name); var point = cameraButtons.Find(x => selectedCameraControlItem.name.Contains(x.name)).point; CommandManager.Instance.Execute(new ChangedCameraCommand(point)); selectedCameraControlItem = null; //SceneMain.Instance.uiManager.GetCanvas().GetPanel().HideItem(); } } public void SettingButtons() { if (cameraControlItem == null || cameraViewPoints.Count == 0) return; // Destroy existing buttons and clear the list to prevent duplicates on re-initialization. foreach (Transform child in transform) { Destroy(child.gameObject); } cameraButtons.Clear(); for (int i = 0; i < cameraViewPoints.Count; i++) { var cameraButton = Instantiate(cameraControlItem, transform); cameraButton.SettingButton(cameraViewPoints[i]); cameraButton.OnItemClicked += HandleItemClicked; cameraButtons.Add(cameraButton); } } private void HandleItemClicked(CameraControlItem item) { var floorControl = SceneMain.Instance.GetManager().GetCanvas().GetPanel(); floorControl.ChangedCurrentFloor(item.floorIndex); if (!isSceneReady) { selectedCameraControlItem = item; Debug.Log("Scene not ready. Camera change deferred."); return; } CommandManager.Instance.Execute(new ChangedCameraCommand(item.point)); //SceneMain.Instance.uiManager.GetCanvas().GetPanel().HideItem(); } } }