330 lines
9.5 KiB
C#
330 lines
9.5 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using DG.Tweening;
|
||
using UnityEditor.UIElements;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
public class OpcOrder2 : MonoBehaviour
|
||
{
|
||
#region 废了
|
||
//public Dropdown dropdown; // Dropdown 组件
|
||
//private string originalText; // 存储原始显示的文字
|
||
//public static OpcOrder2 opcOrder2;
|
||
//public string defaultOption = "不想上班!"; // 默认选项
|
||
//private bool isDropdownInitialized = false;
|
||
|
||
//private void Start()
|
||
//{
|
||
// // 初始化 Dropdown
|
||
// if (dropdown == null)
|
||
// {
|
||
// dropdown = GetComponent<Dropdown>();
|
||
// }
|
||
|
||
// // 清空默认选项
|
||
// dropdown.options.Clear();
|
||
|
||
// // 添加默认显示的选项
|
||
// dropdown.options.Add(new Dropdown.OptionData(defaultOption)); // 默认选项A
|
||
// dropdown.captionText.text = defaultOption; // 设置默认显示文字
|
||
|
||
// // 初始化下拉选项(不包括 A)
|
||
// dropdown.options.Add(new Dropdown.OptionData("选项 B"));
|
||
// dropdown.options.Add(new Dropdown.OptionData("选项 C"));
|
||
// dropdown.options.Add(new Dropdown.OptionData("选项 D"));
|
||
|
||
// // 添加值变化事件
|
||
// dropdown.onValueChanged.AddListener(OnDropdownValueChanged);
|
||
|
||
// // 初始化绑定选项的点击事件
|
||
// BindToggleEvents();
|
||
//}
|
||
|
||
//// 设置默认选项文本,外部可以调用这个方法改变默认文本
|
||
//public string SetText(string str)
|
||
//{
|
||
// defaultOption = str;
|
||
// dropdown.captionText.text = defaultOption; // 设置默认选项的显示文本
|
||
// return str;
|
||
//}
|
||
|
||
//// 当下拉框的值改变时触发
|
||
//private void OnDropdownValueChanged(int index)
|
||
//{
|
||
// if (isDropdownInitialized)
|
||
// {
|
||
// // 更新下拉框显示的文字为选中的选项
|
||
// // 但是不改变默认选项的值
|
||
// dropdown.captionText.text = dropdown.options[index].text;
|
||
|
||
// // 执行自定义逻辑
|
||
// Debug.Log($"点击了选项:{dropdown.options[index].text}");
|
||
// }
|
||
|
||
// isDropdownInitialized = true;
|
||
//}
|
||
|
||
//// 动态绑定选项的 Toggle 点击事件
|
||
//private void BindToggleEvents()
|
||
//{
|
||
// // 获取 Dropdown 的 Template(下拉项模板)
|
||
// Transform dropdownTemplate = dropdown.transform.Find("Template");
|
||
|
||
// if (dropdownTemplate != null)
|
||
// {
|
||
// Transform viewport = dropdownTemplate.Find("Viewport");
|
||
// if (viewport != null)
|
||
// {
|
||
// Transform content = viewport.Find("Content");
|
||
// if (content != null)
|
||
// {
|
||
// // 遍历 Content 下的所有子物体(即下拉列表中的选项)
|
||
// foreach (Transform option in content)
|
||
// {
|
||
// Toggle toggle = option.GetComponent<Toggle>();
|
||
// if (toggle != null)
|
||
// {
|
||
// string optionText = option.GetComponentInChildren<Text>().text;
|
||
|
||
// // 为每个选项绑定点击事件
|
||
// toggle.onValueChanged.AddListener((isOn) =>
|
||
// {
|
||
// if (isOn)
|
||
// {
|
||
// HandleOptionClick(optionText);
|
||
// toggle.isOn = false; // 重置 Toggle 状态,防止选项保持选中
|
||
// }
|
||
// });
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// else
|
||
// {
|
||
// Debug.LogWarning("未找到 Dropdown 的 Template 部分,无法绑定点击事件!");
|
||
// }
|
||
//}
|
||
|
||
//// 处理选项点击逻辑
|
||
//private void HandleOptionClick(string optionText)
|
||
//{
|
||
// Debug.Log($"点击了选项:{optionText}");
|
||
|
||
// // 根据点击的选项执行不同的逻辑
|
||
// switch (optionText)
|
||
// {
|
||
// case "选项 B":
|
||
// Debug.Log("执行选项 B 的逻辑!");
|
||
// break;
|
||
// case "选项 C":
|
||
// Debug.Log("执行选项 C 的逻辑!");
|
||
// break;
|
||
// case "选项 D":
|
||
// Debug.Log("执行选项 D 的逻辑!");
|
||
// break;
|
||
// default:
|
||
// Debug.LogWarning($"未处理的选项:{optionText}");
|
||
// break;
|
||
// }
|
||
//}
|
||
#endregion
|
||
public GameObject Tip;
|
||
public Button btn;
|
||
public GameObject itemPrefab; // 用于生成的Item预制体
|
||
public Transform contentTransform; // Content的Transform
|
||
public JSONReader jsonReader;
|
||
public List<List<string>> groupedData;
|
||
public List<GameObject> ItemList;
|
||
public string name;
|
||
|
||
public OpcOrder2 hylCS;
|
||
int a = 0;
|
||
private void Start()
|
||
{
|
||
|
||
GetOpcID(8006);
|
||
hylCS = this;
|
||
btn.onClick.AddListener(() =>
|
||
{
|
||
bool isActive = Tip.activeSelf;
|
||
Tip.SetActive(!isActive);
|
||
if (ItemList.Count == 0)
|
||
{
|
||
Debug.Log("进来了");
|
||
CreateItem(2001, 0);
|
||
}
|
||
});
|
||
}
|
||
/// <summary>
|
||
/// 传入一个
|
||
/// </summary>
|
||
/// <param name="ID"></param>
|
||
public void GetOpcID(int ID)
|
||
{
|
||
a = ID;
|
||
name=jsonReader.GetOcpName(a);
|
||
}
|
||
public void CreateItem(int ID, int k)
|
||
{
|
||
if (k > 3)
|
||
{
|
||
if (k == 4) k = 1;
|
||
if (k == 5) k = 2;
|
||
if (k == 6) k = 3;
|
||
}
|
||
|
||
// 查找数据
|
||
foreach (var kvp in jsonReader.incidentSiteDictionary)
|
||
{
|
||
IncidentSite select = kvp.Value;
|
||
|
||
if (select.Name == ID)
|
||
{
|
||
groupedData = ParseData(select.Role);
|
||
}
|
||
}
|
||
print(groupedData.Count);
|
||
// 检查 k 是否有效
|
||
if (k < 0 || k >= groupedData.Count)
|
||
{
|
||
Debug.LogError($"索引 k 超出范围!k = {k}, groupedData.Count = {groupedData.Count}");
|
||
return;
|
||
}
|
||
|
||
// 检查 groupedData[k] 是否为空或无数据
|
||
if (groupedData[k] == null || groupedData[k].Count == 0)
|
||
{
|
||
Debug.LogError($"groupedData[{k}] 是空或没有数据!");
|
||
return;
|
||
}
|
||
|
||
// 动态生成Item并添加到Content
|
||
for (int i = 0; i < groupedData[k].Count; i++)
|
||
{
|
||
// 生成Item并设置为Content的子物体
|
||
GameObject newItem = Instantiate(itemPrefab, contentTransform);
|
||
ItemList.Add(newItem);
|
||
|
||
// 为每个Item添加按钮点击事件
|
||
Button button = newItem.GetComponent<Button>();
|
||
if (button != null)
|
||
{
|
||
// 捕获当前的Item对象,避免闭包问题
|
||
GameObject currentItem = newItem;
|
||
|
||
// 根据具体需求绑定独立的隐藏逻辑
|
||
button.onClick.AddListener(() => OnItemClick(currentItem, i)); // 传入索引和对象
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("生成的Item中没有找到Button组件!");
|
||
}
|
||
}
|
||
|
||
// 设置文本
|
||
SetItemText(k);
|
||
|
||
}
|
||
|
||
// 点击事件处理函数,支持单独管理
|
||
private void OnItemClick(GameObject item, int index)
|
||
{
|
||
Debug.Log("被点击了" + index);
|
||
if ( item.GetComponentInChildren<Text>().text==name)
|
||
{
|
||
|
||
|
||
}
|
||
else
|
||
{
|
||
item.SetActive(false); // 仅隐藏需要隐藏的Item
|
||
Tip.SetActive(false);
|
||
}
|
||
}
|
||
|
||
//// 判断是否需要隐藏当前Item
|
||
//private bool ShouldHideItem(int index)
|
||
//{
|
||
// // 示例逻辑:根据索引决定是否隐藏
|
||
// // 比如隐藏索引为偶数的Item
|
||
|
||
// return index == a;
|
||
//}
|
||
//设置文本
|
||
public void SetItemText(int k)
|
||
{
|
||
// 检查 k 是否有效
|
||
if (k < 0 || k >= groupedData.Count)
|
||
{
|
||
Debug.LogError($"索引 k 超出范围!k = {k}, groupedData.Count = {groupedData.Count}");
|
||
return;
|
||
}
|
||
|
||
for (int i = 1; i < ItemList.Count+1; i++)
|
||
{
|
||
// 检查 i 是否超出 groupedData[k] 的范围
|
||
if (i >= groupedData[k].Count)
|
||
{
|
||
Debug.LogWarning($"索引 i 超出范围!i = {i}, groupedData[{k}].Count = {groupedData[k].Count}");
|
||
break;
|
||
}
|
||
|
||
|
||
Text itemText = ItemList[i].GetComponentInChildren<Text>();
|
||
if (itemText != null)
|
||
{
|
||
itemText.text = jsonReader.GetOcpName(int.Parse(groupedData[k][i]));
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("生成的Item中没有找到Text组件!");
|
||
}
|
||
}
|
||
}
|
||
public static List<List<string>> ParseData(string data)
|
||
{
|
||
// 存储最终结果
|
||
List<List<string>> result = new List<List<string>>();
|
||
|
||
// 按 `|` 分割字符串
|
||
string[] groups = data.Split('|');
|
||
foreach (var group in groups)
|
||
{
|
||
// 按 `,` 分割每组数据
|
||
string[] items = group.Split(',');
|
||
|
||
// 添加到结果中
|
||
result.Add(new List<string>(items));
|
||
}
|
||
|
||
return result;
|
||
}
|
||
/// <summary>
|
||
/// 从当前物体逐层向上查找特定父物体的某个组件
|
||
/// </summary>
|
||
/// <typeparam name="T">要查找的组件类型</typeparam>
|
||
/// <returns>返回找到的组件引用,如果未找到则返回 null</returns>
|
||
public T FindParentOfType<T>() where T : Component
|
||
{
|
||
Transform current = transform;
|
||
|
||
// 向上查找,直到没有父物体
|
||
while (current.parent != null)
|
||
{
|
||
current = current.parent;
|
||
T component = current.GetComponent<T>();
|
||
if (component != null)
|
||
{
|
||
return component; // 找到目标组件,返回
|
||
}
|
||
}
|
||
|
||
// 如果未找到目标组件,返回 null
|
||
return null;
|
||
}
|
||
|
||
}
|