using Cysharp.Threading.Tasks; using Simulator.Config; using Simulator.Data.Transport; using System; using System.Collections.Generic; using UVC.Core; using UVC.Factory; using UVC.Network; using UVC.UI.Loading; namespace Simulator.Data { public class ComponentsManager : SingletonScene { private Dictionary componentDatas = new Dictionary(); public static LogicDetailData logicDetailData; public static Webconfig webconfigData; public SimulatorCodeDataClass codedata; public event Action onProjectNameReceived; public event Action onUserNameReceived; private ComponentPoolManager _poolManager; private ComponentMqttHandler _mqttHandler; public ComponentUIBinder UIBinder => _poolManager.UIBinder; protected override void Init() { _poolManager = new ComponentPoolManager(transform); _poolManager.InitializeAllPools(); _poolManager.InitializeUIBinder(); _mqttHandler = new ComponentMqttHandler(_poolManager); } public async UniTask Request() { var data = await HttpRequester.RequestGet($"{Constants.HTTP_DOMAIN}/simulation/logics/{SimulationConfig.logicId}", null, null, true); await SetDataAsync(data); } public async UniTask Request(string projectId) { var data = await HttpRequester.RequestGet($"{Constants.HTTP_DOMAIN}/simulation/logics?projectIds={projectId}", null, null, true); await SetDataAsync(data); } public async UniTask SetDataAsync(Totaljson totaljson) { var row = totaljson?.data?.rows?[0]; if (row == null) return; UILoadingBar.Show("Loading..."); UILoadingBar.Percent = 0f; webconfigData = row.webConfig; logicDetailData = row.data; SimulationConfig.userId = int.Parse(row.userId); PathIndexer.Build(logicDetailData); onProjectNameReceived?.Invoke(row.name); onUserNameReceived?.Invoke(row.user?.name); // 프레임 분산 스폰 componentDatas = await _poolManager.SpawnComponentsAsync(logicDetailData); UILoadingBar.Message = "오브젝트 생성중..."; ApplyCamera(logicDetailData); await UniTask.Yield(); UILoadingBar.Message = "카메라 셋팅중..."; UILoadingBar.Percent = 0.8f; ApplyTemplates(logicDetailData); await UniTask.Yield(); UILoadingBar.Message = "운송수단 셋팅중..."; UILoadingBar.Percent = 0.9f; ApplyTransportSystem(logicDetailData); await UniTask.Yield(); UILoadingBar.Message = "컨베이어 벨트 연결중..."; UILoadingBar.Percent = 0.95f; ApplyConveyors(logicDetailData); UILoadingBar.Percent = 1f; UILoadingBar.Hide(); } private void ApplyCamera(LogicDetailData logic) { var cam = logic?.camAngle; if (cam != null) FactoryCameraController.Instance.SetCamera(cam); } private void ApplyTemplates(LogicDetailData logic) { var prefabs = logic?.templates?.prefabs; if (prefabs is { Count: > 0 }) PrefabManager.Instance.SetPrefabs(prefabs); } private void ApplyTransportSystem(LogicDetailData logic) { var ts = logic?.transport_system; if (ts == null) return; var networks = ts.node_networks; if (networks is { Count: > 0 }) { foreach (var net in networks) { AGVNodeManager.Instance.SpawnNode(net.nodes); AGVNodeManager.Instance.LinkNode(net.edges); } } var managers = ts.transport_managers; if (managers is not { Count: > 0 }) return; foreach (var manager in managers) { var fleets = manager.vehicle_fleets; if (fleets is not { Count: > 0 }) continue; foreach (var fleet in fleets) AGVManager.Instance.SpawnAGV(fleet.vehicles, manager.manager_type); } } private void ApplyConveyors(LogicDetailData logic) { var conveyors = logic?.production_system?.conveyors; if (conveyors is { Count: > 0 }) ConveyorManager.Instance.Build(conveyors); } public void SetMQTT(SimulatorCodeDataClass sdata) { codedata = sdata; _mqttHandler.SetMQTT(sdata, logicDetailData); } public void SubscribeTopic() { _mqttHandler.SubscribeTopic(componentDatas); } public ComponentBase GetComponentData(string name) { if (componentDatas.ContainsKey(name)) { return componentDatas[name]; } return null; } } }