Files
Studio/Assets/Scripts/Studio/TwinObject/DynamicObject/AGVManager.cs
2025-05-29 14:10:36 +09:00

127 lines
4.2 KiB
C#

using Studio.AssetTool;
using Studio.Core;
using Studio.Dynamic.TwinObject;
using Studio.Manage;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Studio.Dynamic.Manager
{
public class AGVManager : UnitySingleton<AGVManager>
{
private CustomAssetRenderObject agvRenderObj;
private ConnectedAsset asset;
private HashSet<AGV> agvs = new();
public float AGVMoveSpeed;
public float AGVRotateSpeed;
public void OnPlayStart()
{
agvRenderObj.gameObject.SetActive(false);
var type = agvRenderObj.topic;
var connector = ManagerHub.instance.Get<CustomAssetConnector>();
asset = connector.connectedAssets.FirstOrDefault(x => x.renderObject == agvRenderObj);
if (asset == null)
{
//todo::팝업메시지 나주엥 설정....
return;
}
StudioService.instance.AddTypeListener(type, OnDataUpdate);
StudioService.instance.AddTypeIdListener(type);
}
/// <summary>
/// MQTT
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnDataUpdate(object sender, StudioServiceTypeEventArgs e)
{
var entities = e.Entitis;
foreach (var entity in entities)
{
var key = entity.Key;
var value = entity.Value;
if (agvs.FirstOrDefault(x => x.name.Equals(key)))
{
Debug.Log($"중복된 ID {key}");
continue;
}
var item = CreateAGV(e.Type, key, value);
if (item == null)
continue;
SetRenderObject(key, item.GetComponent<CustomAssetRenderObject>());
agvs.Add(item);
}
}
private AGV CreateAGV(string type, string id, Dictionary<string, string> entity)
{
var xPos = entity.FirstOrDefault(x => x.Key.Equals("X", StringComparison.OrdinalIgnoreCase));
var yPos = entity.FirstOrDefault(x => x.Key.Equals("Y", StringComparison.OrdinalIgnoreCase));
float.TryParse(xPos.Value, out var x);
float.TryParse(yPos.Value, out var y);
if (y * 0.001f > 200f)
return null;
var agv = ManagerHub.instance.Get<CustomAssetConnector>().CreateAsset(asset.assetData.assetName).AddComponent<AGV>();
agv.gameObject.SetActive(true);
agv.transform.position = Vector3.zero;
agv.name = id;
agv.SetMoveSpeed(AGVMoveSpeed);
agv.SetRotateSpeed(AGVRotateSpeed);
var pos = new Vector3(x * 0.001f, 0, y * 0.001f);
agv.Init(type, pos);
return agv;
}
private void SetRenderObject(string key, CustomAssetRenderObject obj)
{
obj.LoadCreate(key, asset.renderObject.topic, asset.renderObject.componetKey, asset.renderObject.isAutoId);
}
/// <summary>
/// API 연결했을때
/// </summary>
private void SetBaseUpdate()
{
var baseDatas = StudioService.instance.apiData;
var agvKey = baseDatas.Keys.FirstOrDefault(x => x.Contains("AGV", StringComparison.OrdinalIgnoreCase));
var agvDatas = baseDatas[agvKey].Entity;
foreach (var data in agvDatas)
{
var id = data.FirstOrDefault(x => x.Key.Equals("ID", StringComparison.OrdinalIgnoreCase));
CreateAGV("AGV", id.Value, data);
}
}
public void SetCopyObject(bool isAuto, CustomAssetRenderObject renderObject)
{
if (isAuto)
{
agvRenderObj = renderObject;
//이벤트 걸어둔다..
ManagerHub.instance.Get<RunManager>().onRun += OnPlayStart;
}
else
{
agvRenderObj = null;
ManagerHub.instance.Get<RunManager>().onRun -= OnPlayStart;
//이벤트해제
//-= OnPlayStart
}
}
}
}