161 lines
5.1 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|