3D 동적 객체 생성 설정 모달 및 UI 동적 생성 모달 UI 작업
This commit is contained in:
24469
Assets/NewStudioJYM/3D Factory.unity
Normal file
24469
Assets/NewStudioJYM/3D Factory.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/NewStudioJYM/3D Factory.unity.meta
Normal file
7
Assets/NewStudioJYM/3D Factory.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9a6930af93fbf0e4ab56103bf715341e
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
67
Assets/NewStudioJYM/Scripts/Panel_DynamicObjectUISetting.cs
Normal file
67
Assets/NewStudioJYM/Scripts/Panel_DynamicObjectUISetting.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 302b5cd86eb1ba048bfeb746904a2b07
|
||||
49
Assets/NewStudioJYM/Scripts/Panel_GenerateDynamicObject.cs
Normal file
49
Assets/NewStudioJYM/Scripts/Panel_GenerateDynamicObject.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a14b48ef22b10684b9eea422765b7437
|
||||
@@ -13,6 +13,8 @@ namespace XED
|
||||
public Panel_MQTTConnectModal panel_mqttconnectmodal;
|
||||
public Panel_DataFilterSetting panel_datafiltersetting;
|
||||
public Panel_APIConnectModal panel_apiconnectmodal;
|
||||
public Panel_GenerateDynamicObject panel_generatedynamicobject;
|
||||
public Panel_DynamicObjectUISetting panel_dynamicobjectuisetting;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace XED
|
||||
|
||||
canvas_Popup.panel_datafiltersetting.onSaveFilterData += canvas_Popup.panel_mqttconnectmodal.SetFilterData;
|
||||
canvas_Popup.panel_datafiltersetting.onSaveFilterData += canvas_Popup.panel_apiconnectmodal.SetFilterData;
|
||||
|
||||
canvas_Popup.panel_generatedynamicobject.onUISetting += canvas_Popup.panel_dynamicobjectuisetting.SetData;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,4 +116,42 @@ namespace XED
|
||||
public string selectedUrl;
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
45
Assets/NewStudioJYM/Scripts/UI_DynamicDataStyleItem.cs
Normal file
45
Assets/NewStudioJYM/Scripts/UI_DynamicDataStyleItem.cs
Normal 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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5a25b4773a3702b4091e90951e6ad394
|
||||
99
Assets/NewStudioJYM/Scripts/UI_DynamicObjectItem.cs
Normal file
99
Assets/NewStudioJYM/Scripts/UI_DynamicObjectItem.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/NewStudioJYM/Scripts/UI_DynamicObjectItem.cs.meta
Normal file
2
Assets/NewStudioJYM/Scripts/UI_DynamicObjectItem.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 46dc7fe14d2d43348ba3f5ffc3895da2
|
||||
79
Assets/NewStudioJYM/Scripts/UI_DynamicObjectUISettingItem.cs
Normal file
79
Assets/NewStudioJYM/Scripts/UI_DynamicObjectUISettingItem.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 36a57cb1e80b16e48a165fa69785b249
|
||||
82
Assets/Resources/DynamicObjectData.json
Normal file
82
Assets/Resources/DynamicObjectData.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
7
Assets/Resources/DynamicObjectData.json.meta
Normal file
7
Assets/Resources/DynamicObjectData.json.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 80423568c089ad343b72475320f4aa5d
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
10
Assets/Resources/ModelList.json
Normal file
10
Assets/Resources/ModelList.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"modelList": [
|
||||
{
|
||||
"modelName": "AGV Model"
|
||||
},
|
||||
{
|
||||
"modelName": "AMR Model"
|
||||
}
|
||||
]
|
||||
}
|
||||
7
Assets/Resources/ModelList.json.meta
Normal file
7
Assets/Resources/ModelList.json.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 131e47b1a55eb1b4e9fb3724f11d569d
|
||||
TextScriptImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
1502
Assets/Resources/Prefabs/UI/PRF_DynamicDataStyleItem.prefab
Normal file
1502
Assets/Resources/Prefabs/UI/PRF_DynamicDataStyleItem.prefab
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 44cc8c18effd2a540957c4c993290298
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
2888
Assets/Resources/Prefabs/UI/PRF_DynamicObjectItem.prefab
Normal file
2888
Assets/Resources/Prefabs/UI/PRF_DynamicObjectItem.prefab
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 82afa95666a3c1d4aabe20b438502362
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
2940
Assets/Resources/Prefabs/UI/PRF_DynamicObjectUISettingItem.prefab
Normal file
2940
Assets/Resources/Prefabs/UI/PRF_DynamicObjectUISettingItem.prefab
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1781e03321cd36d4290b7d9a5e73c89c
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user