3D 동적 객체 생성 설정 모달 및 UI 동적 생성 모달 UI 작업

This commit is contained in:
정영민
2025-05-14 09:12:33 +09:00
parent ed51e6f85a
commit 297c7b1e53
25 changed files with 32324 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9a6930af93fbf0e4ab56103bf715341e
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,67 @@
using System.Collections.Generic;
using UnityEngine;
using XRLib.UI;
namespace XED
{
public class Panel_DynamicObjectUISetting : PanelBase
{
private UI_DynamicObjectUISettingItem prf_DynamicObjectUISettingItem;
private UI_DynamicDataStyleItem prf_DynamicDataStyleItem;
private RectTransform DataContent;
private UI_DynamicObjectUISettingItem dynamicObjectUISettingItem;
public override void AfterAwake()
{
prf_DynamicObjectUISettingItem = Resources.Load<UI_DynamicObjectUISettingItem>("Prefabs/UI/PRF_DynamicObjectUISettingItem");
prf_DynamicDataStyleItem = Resources.Load<UI_DynamicDataStyleItem>("Prefabs/UI/PRF_DynamicDataStyleItem");
CloseModal();
}
public void OpenModal()
{
gameObject.SetActive(true); ;
}
public void CloseModal()
{
gameObject.SetActive(false);
}
public void SetData(List<DynamicObjectData> dynamicObjectDatas, RectTransform targetUI)
{
OpenModal();
SetPosition(targetUI);
if (dynamicObjectDatas.Count <= 0)
return;
if(dynamicObjectUISettingItem != null)
{
Destroy(dynamicObjectUISettingItem.gameObject);
dynamicObjectUISettingItem = null;
}
var item = Instantiate(prf_DynamicObjectUISettingItem, DataContent);
item.SetData(dynamicObjectDatas, prf_DynamicDataStyleItem);
dynamicObjectUISettingItem = item;
}
private void SetPosition(RectTransform targetUI)
{
if (targetUI == null || rectTransform == null)
return;
Vector3[] targetCorners = new Vector3[4];
targetUI.GetWorldCorners(targetCorners);
Vector3 targetTopRight = targetCorners[2];
float myUIHeight = rectTransform.rect.height;
float myUIPivotY = rectTransform.pivot.y;
Vector3 desiredWorldPos = targetTopRight + new Vector3(rectTransform.sizeDelta.x / 2f, -myUIHeight * (1 - myUIPivotY), 0f);
Vector3 localPos = rectTransform.parent.InverseTransformPoint(desiredWorldPos);
rectTransform.localPosition = localPos;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 302b5cd86eb1ba048bfeb746904a2b07

View File

@@ -0,0 +1,49 @@
using UnityEngine;
using XRLib.UI;
using UnityEngine.UI;
using TMPro;
using System.Collections.Generic;
using Newtonsoft.Json;
using System;
namespace XED
{
public class Panel_GenerateDynamicObject : PanelBase
{
private Button Button_AddDynamicObject;
public RectTransform ModelContent;
public UI_DynamicObjectItem prf_dynamicObjectItem;
public DynamicObjectDatas dynamicObjectDatas;
public ModelList modelList;
public Action<List<DynamicObjectData>, RectTransform> onUISetting;
private void TestConnectedData()
{
var dynamicObjectDataJson = Resources.Load<TextAsset>("DynamicObjectData").text;
dynamicObjectDatas = JsonConvert.DeserializeObject<DynamicObjectDatas>(dynamicObjectDataJson);
var modelListJson = Resources.Load<TextAsset>("ModelList").text;
modelList = JsonConvert.DeserializeObject<ModelList>(modelListJson);
}
public override void AfterAwake()
{
TestConnectedData();
prf_dynamicObjectItem = Resources.Load<UI_DynamicObjectItem>("Prefabs/UI/PRF_DynamicObjectItem");
Button_AddDynamicObject.onClick.AddListener(OnClickAddDynamicObjectButton);
}
private void OnClickAddDynamicObjectButton()
{
var item = Instantiate(prf_dynamicObjectItem, ModelContent);
item.onUISetting += OnUISetting;
item.SetData(dynamicObjectDatas, modelList);
}
private void OnUISetting(List<DynamicObjectData> datas, RectTransform rectTransform)
{
onUISetting?.Invoke(datas, rectTransform);
}
}
}

View File

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

View File

@@ -13,6 +13,8 @@ namespace XED
public Panel_MQTTConnectModal panel_mqttconnectmodal; public Panel_MQTTConnectModal panel_mqttconnectmodal;
public Panel_DataFilterSetting panel_datafiltersetting; public Panel_DataFilterSetting panel_datafiltersetting;
public Panel_APIConnectModal panel_apiconnectmodal; public Panel_APIConnectModal panel_apiconnectmodal;
public Panel_GenerateDynamicObject panel_generatedynamicobject;
public Panel_DynamicObjectUISetting panel_dynamicobjectuisetting;
private void Awake() private void Awake()
{ {

View File

@@ -12,6 +12,8 @@ namespace XED
canvas_Popup.panel_datafiltersetting.onSaveFilterData += canvas_Popup.panel_mqttconnectmodal.SetFilterData; canvas_Popup.panel_datafiltersetting.onSaveFilterData += canvas_Popup.panel_mqttconnectmodal.SetFilterData;
canvas_Popup.panel_datafiltersetting.onSaveFilterData += canvas_Popup.panel_apiconnectmodal.SetFilterData; canvas_Popup.panel_datafiltersetting.onSaveFilterData += canvas_Popup.panel_apiconnectmodal.SetFilterData;
canvas_Popup.panel_generatedynamicobject.onUISetting += canvas_Popup.panel_dynamicobjectuisetting.SetData;
} }
} }
} }

View File

@@ -116,4 +116,42 @@ namespace XED
public string selectedUrl; public string selectedUrl;
public List<SaveFilterData> saveFilterData = new List<SaveFilterData>(); public List<SaveFilterData> saveFilterData = new List<SaveFilterData>();
} }
[Serializable]
public class DynamicObjectDatas
{
public List<DataList> dataList = new List<DataList>();
}
[Serializable]
public class DataList
{
public string name;
public List<DynamicObjectData> datas = new List<DynamicObjectData>();
}
[Serializable]
public class DynamicObjectData
{
public string name;
public List<Datum> datas = new List<Datum>();
}
[Serializable]
public class Datum
{
public string dataName;
public string dataType;
public string dataValue;
}
[Serializable]
public class ModelList
{
public List<ModelName> modelList = new List<ModelName>();
}
[Serializable]
public class ModelName
{
public string modelName;
}
} }

View File

@@ -0,0 +1,45 @@
using UnityEngine;
using XRLib.UI;
using TMPro;
using System;
using System.Collections.Generic;
namespace XED
{
public enum DataStyle
{
Vector2,
Vector3,
Float,
Int,
String
}
public class UI_DynamicDataStyleItem : UIBase
{
private TextMeshProUGUI Text_DataName;
private TMP_Dropdown Dropdown_DataDisplayStyle;
public void SetData(Datum datum)
{
Text_DataName.SetText(datum.dataName);
SetDataDisplayStyleDropdown();
}
private void SetDataDisplayStyleDropdown()
{
Dropdown_DataDisplayStyle.ClearOptions();
var types = Enum.GetNames(typeof(DataStyle));
List<string> options = new List<string>();
for (int i = 0; i < types.Length; i++)
{
options.Add(types[i]);
}
Dropdown_DataDisplayStyle.AddOptions(options);
Dropdown_DataDisplayStyle.onValueChanged.AddListener(OnDataDisplayStyleValueChanged);
}
private void OnDataDisplayStyleValueChanged(int index)
{
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 5a25b4773a3702b4091e90951e6ad394

View File

@@ -0,0 +1,99 @@
using UnityEngine;
using XRLib.UI;
using TMPro;
using UnityEngine.UI;
using Newtonsoft.Json;
using System.Collections.Generic;
using System;
namespace XED
{
public class UI_DynamicObjectItem : UIBase
{
private TMP_Dropdown Dropdown_Data;
private Button Button_SelectModel;
private TMP_Dropdown Dropdown_Model;
private Button Button_UISetting;
public DynamicObjectDatas dynamicObjectDatas;
public List<DynamicObjectData> selectDynamicObjectData;
public ModelList modelList;
public string selectedModel;
public Action<List<DynamicObjectData>, RectTransform> onUISetting;
public void SetData(DynamicObjectDatas dynamicObjectDatas, ModelList modelList)
{
this.dynamicObjectDatas = dynamicObjectDatas;
this.modelList = modelList;
SetDataDropdown();
SetModelDropdown();
Button_SelectModel.onClick.AddListener(OnClickSelectModelButton);
Button_UISetting.onClick.AddListener(OnClickUISettingButton);
}
public bool IsDataDropdownChanged(TMP_Dropdown dropdown, int value)
{
return dropdown.value != value;
}
private void SetDataDropdown()
{
Dropdown_Data.ClearOptions();
List<string> options = new List<string>();
options.Add("Select URL");
foreach(var dynamicObjectData in dynamicObjectDatas.dataList)
{
options.Add(dynamicObjectData.name);
}
Dropdown_Data.AddOptions(options);
Dropdown_Data.onValueChanged.AddListener(OnDataValueChanged);
OnDataValueChanged(0);
}
private void OnDataValueChanged(int index)
{
if (index - 1 < 0)
return;
selectDynamicObjectData = dynamicObjectDatas.dataList[index - 1].datas;
}
private void SetModelDropdown()
{
Dropdown_Model.ClearOptions();
List<string> options = new List<string>();
options.Add("Select Model");
foreach (var dynamicObjectData in modelList.modelList)
{
options.Add(dynamicObjectData.modelName);
}
Dropdown_Model.AddOptions(options);
Dropdown_Model.onValueChanged.AddListener(OnModelValueChanged);
OnModelValueChanged(0);
}
private void OnModelValueChanged(int index)
{
if (index - 1 < 0)
return;
selectedModel = modelList.modelList[index - 1].modelName;
}
private void OnClickSelectModelButton()
{
Dropdown_Model.Show();
}
private void OnClickUISettingButton()
{
if (selectDynamicObjectData.Count > 0 && selectedModel != string.Empty)
{
onUISetting?.Invoke(selectDynamicObjectData, rectTransform);
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 46dc7fe14d2d43348ba3f5ffc3895da2

View File

@@ -0,0 +1,79 @@
using System.Collections.Generic;
using UnityEngine;
using XRLib.UI;
using UnityEngine.UI;
using TMPro;
using System;
namespace XED
{
public enum UIDesignStyle
{
Sample1,
Sample2,
Sample3
}
public class UI_DynamicObjectUISettingItem : UIBase
{
private TMP_Dropdown Dropdown_ClassName;
private TMP_Dropdown Dropdown_UIDesignStyle;
private RectTransform DataContent;
private UI_DynamicDataStyleItem prf_DynamicDataStyleItem;
private List<UI_DynamicDataStyleItem> dynamicDataStyleItems = new List<UI_DynamicDataStyleItem>();
public List<DynamicObjectData> dynamicObjectDatas = new List<DynamicObjectData>();
public void SetData(List<DynamicObjectData> dynamicObjectDatas, UI_DynamicDataStyleItem dynamicDataStyleItem)
{
prf_DynamicDataStyleItem = dynamicDataStyleItem;
SetClassNameDropdown(dynamicObjectDatas);
SetUIDesignStyleDropdown();
}
private void SetClassNameDropdown(List<DynamicObjectData> dynamicObjectDatas)
{
this.dynamicObjectDatas.Clear();
Dropdown_ClassName.ClearOptions();
List<string> options = new List<string>();
foreach(var dynamicObjectData in dynamicObjectDatas)
{
this.dynamicObjectDatas.Add(dynamicObjectData);
options.Add(dynamicObjectData.name);
}
Dropdown_ClassName.AddOptions(options);
Dropdown_ClassName.onValueChanged.AddListener(OnClassNameValueChanged);
}
private void SetUIDesignStyleDropdown()
{
Dropdown_UIDesignStyle.ClearOptions();
var types = Enum.GetNames(typeof(UIDesignStyle));
List<string> options = new List<string>();
options.Add("Select Dashboard Style");
for (int i = 0; i < types.Length; i++)
{
options.Add(types[i]);
}
Dropdown_UIDesignStyle.AddOptions(options);
}
private void OnClassNameValueChanged(int index)
{
foreach(var item in dynamicDataStyleItems)
{
Destroy(item.gameObject);
}
dynamicDataStyleItems.Clear();
foreach(var dynamicObjectData in dynamicObjectDatas[index].datas)
{
var item = Instantiate(prf_DynamicDataStyleItem, DataContent);
item.SetData(dynamicObjectData);
dynamicDataStyleItems.Add(item);
}
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 36a57cb1e80b16e48a165fa69785b249

View File

@@ -0,0 +1,82 @@
{
"dataList": [
{
"name": "XR/AGV",
"datas": [
{
"name": "AGV_1",
"datas": [
{
"dataName": "Position",
"dataValue": "30,25.5,15.3"
},
{
"dataName": "Rotation",
"dataValue": "0,90,15.5"
},
{
"dataName": "Size",
"dataValue": "15.5,15.5,15.5"
}
]
},
{
"name": "AGV_2",
"datas": [
{
"dataName": "Position",
"dataValue": "20,15.5,5.3"
},
{
"dataName": "Rotation",
"dataValue": "15,90.5,10"
},
{
"dataName": "Size",
"dataValue": "25.5,25.5,25.5"
}
]
}
]
},
{
"name": "XR/AMR",
"datas": [
{
"name": "AMR_1",
"datas": [
{
"dataName": "Position",
"dataValue": "30,25.5,15.3"
},
{
"dataName": "Rotation",
"dataValue": "0,90,15.5"
},
{
"dataName": "Size",
"dataValue": "15.5,15.5,15.5"
}
]
},
{
"name": "AMR_2",
"datas": [
{
"dataName": "Position",
"dataValue": "20,15.5,5.3"
},
{
"dataName": "Rotation",
"dataValue": "15,90.5,10"
},
{
"dataName": "Size",
"dataValue": "25.5,25.5,25.5"
}
]
}
]
}
]
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 80423568c089ad343b72475320f4aa5d
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,10 @@
{
"modelList": [
{
"modelName": "AGV Model"
},
{
"modelName": "AMR Model"
}
]
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 131e47b1a55eb1b4e9fb3724f11d569d
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 44cc8c18effd2a540957c4c993290298
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 82afa95666a3c1d4aabe20b438502362
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1781e03321cd36d4290b7d9a5e73c89c
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: