Files
XRLib/Assets/Scripts/Simulator/Components/ComponentsManager.cs
2026-02-26 17:09:39 +09:00

161 lines
5.1 KiB
C#

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<ComponentsManager>
{
private Dictionary<string, ComponentBase> componentDatas = new Dictionary<string, ComponentBase>();
public static LogicDetailData logicDetailData;
public static Webconfig webconfigData;
public SimulatorCodeDataClass codedata;
public event Action<string> onProjectNameReceived;
public event Action<string> 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<Totaljson>($"{Constants.HTTP_DOMAIN}/simulation/logics/{SimulationConfig.logicId}", null, null, true);
await SetDataAsync(data);
}
public async UniTask Request(string projectId)
{
var data = await HttpRequester.RequestGet<Totaljson>($"{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;
}
}
}