127 lines
4.2 KiB
C#
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
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|