Files
EnglewoodLAB/Assets/Scripts/SceneMain.cs
2026-03-09 17:00:30 +09:00

181 lines
5.5 KiB
C#

using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
using EnglewoodLAB.Management;
using EnglewoodLAB.UI;
using UVC.Core;
using UVC.Management;
using UVC.Studio.Manager;
namespace EnglewoodLAB
{
[DefaultExecutionOrder(90)]
public class SceneMain : SingletonScene<SceneMain>
{
public Building building;
MQTT mqttManager;
public DataManager dataManager;
public ViewManager viewManager;
public MachineInfoItemManager machineInfoItemManager;
public ThermostatInfoItemManager thermostatInfoItemManager;
public EWLUIManager uiManager;
public Action Initialized;
[SerializeField] private GameObject? stage;
public GameObject? Stage => stage;
public Dictionary<string, GameObject> sceneRootTable = new();
protected override void Awake()
{
base.Awake();
if (AppMain.Instance != null)
{
AppMain.Instance.Initialized += InitSceneMain;
}
}
protected override void OnDestroy()
{
base.OnDestroy();
if (AppMain.Instance != null)
{
AppMain.Instance.Initialized -= InitSceneMain;
}
}
public async void InitSceneMain()
{
try
{
BaseCameraPoistion();
await OnAppInitialized();
}
catch (Exception e)
{
Debug.LogError($"[SceneMain] Initialization failed: {e}");
}
}
private async UniTask OnAppInitialized()
{
//await requestDataAsync();
building = FindAnyObjectByType<Building>();
await building.Init();
uiManager = await LoadManager<EWLUIManager>();
machineInfoItemManager = await LoadManager<MachineInfoItemManager>();
//thermostatInfoItemManager = await LoadManager<ThermostatInfoItemManager>();
viewManager = await LoadManager<ViewManager>();
mqttManager = FindAnyObjectByType<MQTT>();
var selectMnager = InjectorAppContext.Instance.Get<SelectionManager>();
selectMnager.Gizmo.Dispose();
selectMnager.Gizmo.Initialize();
dataManager = await LoadManager<DataManager>();
MQTTEventDisConnect();
SetupDataSetting();
// SetSceneTableSetting();
if (Initialized != null)
{
Initialized.Invoke();
}
await UniTask.CompletedTask;
}
private void BaseCameraPoistion()
{
var controller = AppMain.Instance.cameraController;
controller.currentAzimuth = 305f;
controller.currentElevation = 23f;
controller.currentDistance = 10f;
controller.SetTargetPos(new Vector3(17f, 0.05f, -2.806954f));
}
//실제 데이터 받을 시 코드 변경 예정
private void SetupDataSetting()
{
var popupCanvas = uiManager.GetCanvas<PopupCanvas>();
//mqttManager.onThermostatData += dataManager.SetThermostatDataList;
dataManager.onSetThermostatData += popupCanvas.GetPanel<ThermostatControlPanel>().SetData;
}
private void MQTTEventDisConnect()
{
var popupCanvas = uiManager.GetCanvas<PopupCanvas>();
//mqttManager.onThermostatData -= dataManager.SetThermostatDataList;
dataManager.onSetThermostatData -= popupCanvas.GetPanel<ThermostatControlPanel>().SetData;
}
private void SetSceneTableSetting()
{
//var findallRoots = FindObjectsByType<SceneRoot>(FindObjectsSortMode.None);
//foreach (var item in findallRoots)
//{
// switch(item.floorType)
// {
// case FloorType.All:
// sceneRootTable.Add("All", item.gameObject);
// break;
// case FloorType.FirstFloor:
// sceneRootTable.Add("1F", item.gameObject);
// break;
// case FloorType.SecondFloor:
// sceneRootTable.Add("2F", item.gameObject);
// break;
// }
//}
//foreach(var scene in sceneRootTable)
//{
// if(!scene.Key.Equals("1F"))
// {
// var root = scene.Value;
// root.gameObject.SetActive(false);
// }
//}
}
private readonly Dictionary<Type, Manager> managers = new();
private async UniTask<T> LoadManager<T>() where T : Manager
{
var manager = FindAnyObjectByType<T>();
if (manager == null)
{
Debug.LogError($"Manager not found: {typeof(T).Name}");
return null;
}
var type = typeof(T);
if (managers.ContainsKey(type))
{
Debug.LogWarning($"Duplicate Manager: {type.Name}");
return manager;
}
await manager.Init();
managers.Add(type, manager);
return manager;
}
public T GetManager<T>() where T : Manager
{
if (managers.TryGetValue(typeof(T), out var manager))
{
return manager as T;
}
return null;
}
}
}