AGV 정보 창

This commit is contained in:
geondo55
2025-05-27 14:54:39 +09:00
parent b7c34cfc38
commit a81e040123
19 changed files with 354 additions and 56 deletions

View File

Before

Width:  |  Height:  |  Size: 866 B

After

Width:  |  Height:  |  Size: 866 B

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -1558,9 +1558,17 @@ PrefabInstance:
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedGameObjects:
- targetCorrespondingSourceObject: {fileID: 2730612551908113454, guid: 13ace7584c1d4514cb2218354647e355, type: 3}
insertIndex: -1
addedObject: {fileID: 1555786595}
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 13ace7584c1d4514cb2218354647e355, type: 3}
--- !u!224 &396217242 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 2730612551908113454, guid: 13ace7584c1d4514cb2218354647e355, type: 3}
m_PrefabInstance: {fileID: 396217241}
m_PrefabAsset: {fileID: 0}
--- !u!224 &416036583 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 7844719208258716390, guid: 96b73e9674fb61c489cee99ad24c044c, type: 3}
@@ -2315,7 +2323,7 @@ MonoBehaviour:
panel_interferedobjectlist: {fileID: 0}
panel_assetproperties: {fileID: 0}
panel_predefinedtype: {fileID: 0}
panel_objectinfo: {fileID: 0}
panel_dynamicobjectinfo: {fileID: 0}
panel_objectalign: {fileID: 0}
panel_tooltip: {fileID: 0}
panel_propertyviewer: {fileID: 0}
@@ -2333,7 +2341,6 @@ MonoBehaviour:
panel_agv: {fileID: 0}
panel_dataconnectmodal: {fileID: 0}
panel_alarmconnectmodal: {fileID: 0}
panel_dynamicobjectinfo: {fileID: 0}
--- !u!114 &545811783
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -7805,6 +7812,147 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 7e770d58ca963cd42a42328ab60b8216, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &1555786594
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1555786595}
- component: {fileID: 1555786599}
- component: {fileID: 1555786598}
- component: {fileID: 1555786596}
- component: {fileID: 1555786600}
m_Layer: 5
m_Name: Button_Play
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1555786595
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1555786594}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 396217242}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: -15, y: 0}
m_SizeDelta: {x: 40, y: 40}
m_Pivot: {x: 1, y: 0.5}
--- !u!114 &1555786596
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1555786594}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreLayout: 1
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: -1
m_PreferredHeight: -1
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!114 &1555786598
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1555786594}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 16ab77a8cc636504bada37c9dd4971ef, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &1555786599
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1555786594}
m_CullTransparentMesh: 1
--- !u!114 &1555786600
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1555786594}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 1555786598}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!1001 &1572491609
PrefabInstance:
m_ObjectHideFlags: 0

View File

@@ -10,6 +10,7 @@ using System.Collections;
using Studio.AssetLibraryTree;
using Studio;
using System.Drawing.Printing;
using System.Diagnostics.Eventing.Reader;
namespace Studio.AssetTool
{
@@ -122,7 +123,7 @@ namespace Studio.AssetTool
public GameObject CreateAsset(string name)
{
AssetLibraryItem item = assetScrollView.FindItem("Palletrobot", AssetLibraryItemType.file);
AssetLibraryItem item = assetScrollView.FindItem(name, AssetLibraryItemType.file);
OnAssetSelected(item);
GameObject obj = selectRenderObject.gameObject;
@@ -281,9 +282,17 @@ namespace Studio.AssetTool
internal void OnSelectObjects(string name, List<GameObject> selectedObjects)
{
var canvas_Popup = EventConnector.instance.GetCanvas<Canvas_Popup>();
canvas_Popup.panel_dynamicobjectinfo.SetObjectInfo(name, selectedObjects);
canvas_Popup.panel_dynamicobjectinfo.SetActive(true);
canvas_Popup.panel_agv.SetTarget(selectedObjects);
if (ManagerHub.instance.Get<RunManager>().curState == RunManager.EState.Run)
{
canvas_Popup.panel_dynamicobjectinfo.gameObject.SetActive(false);
canvas_Popup.panel_agv.SetTarget(selectedObjects);
}
else
{
canvas_Popup.panel_dynamicobjectinfo.SetObjectInfo(name, selectedObjects);
canvas_Popup.panel_dynamicobjectinfo.SetActive(true);
canvas_Popup.panel_agv.gameObject.SetActive(false);
}
canvas_Popup.panel_objectdistance.SelectObjectFromClick(name, selectedObjects);
}
}

View File

@@ -3,6 +3,7 @@ using Best.MQTT.Packets.Builders;
using Newtonsoft.Json.Linq;
using Studio.Conifg;
using Studio.Setting.Connect;
using Studio.Util;
using System;
using System.Collections.Generic;
using System.Text;
@@ -36,7 +37,7 @@ namespace Studio
public void MQTTCreateConnect(string MQTTDomain,string MQTTPort)
{
var conntedInfo = $"MQTT Domain : {MQTTDomain} , MQTTPORT :{MQTTPort}";
var conntedInfo = CreateConntedInfo(MQTTDomain, MQTTPort);
Debug.Log(conntedInfo);
var port = int.Parse(MQTTPort);
var options = new ConnectionOptionsBuilder()
@@ -57,6 +58,23 @@ namespace Studio
clients[conntedInfo].OnDisconnect += OnDisconnectedMQTT;
clients[conntedInfo].OnError += OnErrorMQTT;
}
public string CreateConntedInfo(string MQTTDomain, string MQTTPort)
{
return $"MQTT Domain : {MQTTDomain} , MQTTPORT :{MQTTPort}";
}
public MQTTClient FindClient(string MQTTDomain, string MQTTPort)
{
string key = CreateConntedInfo(MQTTDomain, MQTTPort);
if (clients.ContainsKey(key))
{
return clients[key];
}
else
{
return null;
}
}
private ConnectPacketBuilder ConnectPacketBuilderCallback(MQTTClient client, ConnectPacketBuilder builder)
{
return builder.WithKeepAlive(60 * 60);//keep alive 1시간으로
@@ -100,7 +118,6 @@ namespace Studio
}
}
private void OnStateChangedMQTT(MQTTClient client, ClientStates oldState, ClientStates newState)
{
Debug.Log($"{oldState} => {newState}");
@@ -118,6 +135,17 @@ namespace Studio
Debug.Log($"MQTT OnConnected");
}
public void DisConnectMQTT()
{
foreach (var client in clients)
{
client.Value?.CreateDisconnectPacketBuilder()
.WithReasonCode(DisconnectReasonCodes.NormalDisconnection)
.WithReasonString($"{client.Value.Options.Host} Disconnecting")
.BeginDisconnect();
}
}
/// <summary>
/// 구독
/// </summary>
@@ -140,6 +168,19 @@ namespace Studio
.BeginUnsubscribe();
}
public void UnSubscibeAll()
{
List<MQTTConnection> mqttConnections = ConfigConnected.MQTTSettings.mqttConnections;
foreach (var connection in mqttConnections)
{
foreach (var topic in connection.topics)
{
UnSubscibe(FindClient(connection.domain, connection.port), topic.topic);
}
}
}
private void OnTopic(MQTTClient client, SubscriptionTopic topic, string topicName, ApplicationMessage message)
{
string payload = Encoding.UTF8.GetString(message.Payload.Data, message.Payload.Offset, message.Payload.Count);
@@ -200,5 +241,6 @@ namespace Studio
}
}
}
}

View File

@@ -40,8 +40,8 @@ namespace Studio
public class StudioService : UnitySingleton<StudioService>
{
private Dictionary<string, Dictionary<string, EventHandler<StudioServiceIdEventArgs>>> listenerIdMap;
private Dictionary<string, EventHandler<StudioServiceTypeEventArgs>> listenerTypeMap;
private Dictionary<string, Dictionary<string, EventHandler<StudioServiceIdEventArgs>>> listenerIdMap =new();
private Dictionary<string, EventHandler<StudioServiceTypeEventArgs>> listenerTypeMap = new();
private StudioRepoistory repository;
private Dictionary<string, float> updateTime = new();
@@ -76,24 +76,27 @@ namespace Studio
private Dictionary<string, List<Topic>> topicTable = new();
public Dictionary<string, List<Topic>> TopciTable { get { return topicTable; } }
public void ConnectMQTT(string domain, string port, List<Util.Topic> topics)
public void Init()
{
this.repository = new StudioRepoistory();
listenerIdMap = new Dictionary<string, Dictionary<string, EventHandler<StudioServiceIdEventArgs>>>();
listenerTypeMap = new Dictionary<string, EventHandler<StudioServiceTypeEventArgs>>();
repository.OnTopicList += OnTopicList;
}
public void ConnectMQTT(string domain, string port, List<Util.Topic> topics)
{
var conntedInfo = $"MQTT Domain : {domain} , MQTTPORT :{port}";
if (!topicTable.ContainsKey(conntedInfo))
topicTable.Add(conntedInfo, new());
topicTable[conntedInfo] = topics;
repository.MQTTCreateConnect(domain, port);
repository.MQTTConnect(conntedInfo);
}
public void DisConnectMQTT()
{
repository.DisConnectMQTT();
}
private void OnTopicList(string type, Dictionary<string, Dictionary<string, string>> entities)
{
DateTime now = DateTime.Now;

View File

@@ -26,6 +26,7 @@ namespace Studio.Manage
Join(new AGVManager());
Join(new AssetManager());
Join(new SceneStartSettingService());
Join(new RunManager());
foreach(var m in managers)
{

View File

@@ -0,0 +1,71 @@
using NUnit.Framework;
using Studio.Conifg;
using Studio.Manage;
using Studio.Util;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Studio.Manage
{
public class RunManager : Manager
{
public event Action onRun;
public event Action onStop;
public enum EState
{
Run,
Stop,
Exit,
}
public EState curState = EState.Stop;
public override void Init()
{
StudioService.instance.Init();
onRun += Dynamic.M.AGVManager.instance.OnPlayStart;
onStop += StudioService.instance.DisConnectMQTT;
}
public void ChangeState()
{
curState = curState == EState.Stop ? EState.Run : EState.Stop;
Debug.Log("curState " + curState);
switch (curState)
{
case EState.Run:
Run();
break;
case EState.Stop:
Stop();
break;
case EState.Exit:
break;
}
}
public void Run()
{
MQTTConeect();
onRun?.Invoke();
}
public void Stop()
{
onStop?.Invoke();
}
public void MQTTConeect()
{
var mqttsettings = ConfigConnected.MQTTSettings;
foreach (var mqtt in mqttsettings.mqttConnections)
{
StudioService.instance.ConnectMQTT(mqtt.domain, mqtt.port, mqtt.topics);
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 1e365cd468c835846860290f5fa3f1aa

View File

@@ -23,6 +23,7 @@ namespace Studio.Dynamic.TwinObject
Quaternion startRot;
Quaternion endRot;
public Action<Dictionary<string, string>> onDataUpdate;
public Dictionary<string, string> CurrentEntity;
private bool isPlay = false;
@@ -82,6 +83,7 @@ namespace Studio.Dynamic.TwinObject
s += "}";
//Debug.Log(s);
SetPos();
onDataUpdate?.Invoke(CurrentEntity);
}

View File

@@ -12,7 +12,7 @@ namespace Studio.Dynamic.M
{
public class AGVManager : UnitySingleton<AGVManager>
{
private GameObject prf_AGV;
private CustomAssetRenderObject renderobject;
private HashSet<AGV> agvs = new();
public float AGVMoveSpeed;
public float AGVRotateSpeed;
@@ -20,20 +20,19 @@ namespace Studio.Dynamic.M
public void Awake()
{
//이벤트 걸어둔다..
//+= OnPlayStart
}
public void OnPlayStart()
{
var type = GetComponent<CustomAssetRenderObject>().addTopic;
var assets = ConfigConnected.AssetSettings;
prf_AGV = assets[type].loadedObject;
if (prf_AGV == null)
{
//todo::팝업메시지 나주엥 설정....
return;
}
//var type = GetComponent<CustomAssetRenderObject>().addTopic;
// var assets = ConfigConnected.AssetSettings;
//prf_AGV = assets[type].loadedObject;
//var connector = ManagerHub.instance.Get<CustomAssetConnector>();
//ConnectedAsset searchAsset = connector.connectedAssets.FirstOrDefault(x => x.renderObject == renderobject);
//searchAsset.assetData.assetName
var type = "AGV";
StudioService.instance.AddTypeListener(type, OnDataUpdate);
StudioService.instance.AddTypeIdListener(type);
}
@@ -61,7 +60,7 @@ namespace Studio.Dynamic.M
private AGV CreateAGV(string type, string id ,Dictionary<string,string> entity)
{
var agv = ManagerHub.instance.Get<CustomAssetConnector>().CreateAsset("AGV").AddComponent<AGV>();
var agv = ManagerHub.instance.Get<CustomAssetConnector>().CreateAsset("Palletrobot").AddComponent<AGV>();
//var agv = Instantiate<AGV>(prf_AGV,transform);
// var agv = Instantiate<GameObject>(prf_AGV,transform).AddComponent<AGV>();

View File

@@ -26,12 +26,15 @@ namespace Studio.UI
var renderObjectHandler = ManagerHub.instance.Get<RenderObjectHandler>();
var fbxFileManager = ManagerHub.instance.Get<FBXFileManager>();
var projectManager = ManagerHub.instance.Get<ProjectManager>();
var runManager = ManagerHub.instance.Get<RunManager>();
statusPanel.SetMode(ModePanel.ProgramMode.ObjectLayout);
//panel_studiotopbar.onClickAssetLibraryWindow += fbxFileManager.LoadLocalData;
panel_studiotopbar.onClickNewProject += () => CommandInvoker.instance.Invoke(new SaveProjectCommand());
panel_studiotopbar.onClickSaveProject += () => CommandInvoker.instance.Invoke(new SaveProjectCommand());
panel_studiotopbar.onClickPlay += runManager.ChangeState;
}
}
}

View File

@@ -5,6 +5,7 @@ using TMPro;
using UnityEngine;
using XRLib.UI;
using System.Linq;
using Studio.Core;
namespace Studio.UI
{
@@ -12,30 +13,26 @@ namespace Studio.UI
{
public GameObject itemPrefab;
public RectTransform Content;
private Dictionary<string, TMP_Text> keyToValueTextMap = new();
private bool isInitialized = false;
private Dictionary<string, TMP_Text> textDict = new();
private bool itemInit;
public Dictionary<string, string> CurrentEntity;
private string targetId = string.Empty;
private AGV prevAgv;
public override void AfterAwake()
{
itemPrefab = Resources.Load<GameObject>("Prefabs/UI/PRF_EntityItem");
}
internal void OnUpdateData(object sender, StudioServiceIdEventArgs e)
internal void OnUpdateData(Dictionary<string, string> entity)
{
if (!itemInit)
{
InstantiateUI(e.Entity);
InstantiateUI(entity);
itemInit = true;
}
else
{
UpdateUI(e.Entity);
UpdateUI(entity);
}
}
@@ -44,14 +41,20 @@ namespace Studio.UI
if (selectedObjects.Count == 0)
return;
GameObject selectedObject = selectedObjects[0];
GameObject selectedObject = selectedObjects[0];
if (prevAgv != null)
{
prevAgv.onDataUpdate -= InstantiateUI;
prevAgv = null;
}
if (selectedObject.TryGetComponent<AGV>(out AGV agv))
{
StudioService.instance.RemoveTypeIdListener("AGV", targetId);
targetId = agv.name;
StudioService.instance.AddTypeIdListener("AGV", targetId, OnUpdateData);
var dic = agv.Info;
SetActive(true);
prevAgv = agv;
OnUpdateData(dic);
agv.onDataUpdate += OnUpdateData;
}
else
{
@@ -66,7 +69,6 @@ namespace Studio.UI
GameObject item = Instantiate(itemPrefab, Content);
var texts = item.GetComponentsInChildren<TMP_Text>();
if (texts.Length < 2) continue;
TMP_Text keyText = texts[0];
TMP_Text valueText = texts[1];
@@ -74,7 +76,7 @@ namespace Studio.UI
keyText.text = kvp.Key;
valueText.text = kvp.Value;
keyToValueTextMap[kvp.Key] = valueText;
textDict[kvp.Key] = valueText;
}
}
@@ -82,9 +84,9 @@ namespace Studio.UI
{
foreach (var kvp in entity)
{
if (keyToValueTextMap.TryGetValue(kvp.Key, out var valueText))
if (textDict.TryGetValue(kvp.Key, out var txt))
{
valueText.text = kvp.Value;
txt.text = kvp.Value;
}
}
}

View File

@@ -37,7 +37,13 @@ namespace Studio.UI
/*Build*/
public Button Button_Build;
public Button Button_Run;
public Button Button_Play;
private Image playImage;
public Sprite RunSprite;
public Sprite StopSprite;
public event Action onClickPlay;
public override void AfterAwake()
{
Button_NewProject.onClick.AddListener(OnClickNewProject);
@@ -52,9 +58,13 @@ namespace Studio.UI
Button_AssetLibraryWindow.onClick.AddListener(OnClickAssetLibraryWindow);
Button_HierarchyWindow.onClick.AddListener(OnClickHierarchyWindow);
Button_Build.onClick.AddListener(OnClickBuild);
Button_Run.onClick.AddListener(OnClickRun);
Button_Play.onClick.AddListener(OnClickPlay);
playImage = Button_Play.GetComponent<Image>();
RunSprite = Resources.Load<Sprite>("Images/Run");
StopSprite = Resources.Load<Sprite>("Images/Stop");
}
private void OnClickNewProject()
@@ -118,5 +128,11 @@ namespace Studio.UI
{
onClickExit?.Invoke();
}
private void OnClickPlay()
{
playImage.sprite = playImage.sprite == RunSprite ? StopSprite : RunSprite;
onClickPlay?.Invoke();
}
}
}

View File

@@ -33,7 +33,7 @@ namespace Studio
StudioService.instance.ConnectMQTT(mqtt.domain,mqtt.port,mqtt.topics);
}
//testcrane.Init("STOCKER_CRANE");
AGVManager.instance.Init();
//AGVManager.instance.Init();
//AGVManager.instance.Init("AGV");
}
private async void Test()
@@ -45,14 +45,14 @@ namespace Studio
}
private void Update()
{
if(Input.GetKeyDown(KeyCode.V))
{
Test();
}
if (Input.GetKeyDown(KeyCode.I))
{
//종료
}
//if(Input.GetKeyDown(KeyCode.V))
//{
// Test();
//}
//if (Input.GetKeyDown(KeyCode.I))
//{
// //종료
//}
if(Input.GetKeyDown(KeyCode.U))
{
//시작