using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI; using static Unity.VisualScripting.FlowStateWidget; public class SelectScenePanel : MonoBehaviour { [Header("组件")] public GameObject scenePrefab;//滑动视图预制体 public Transform sceneList;//预制体列表 public GameObject schoolPrefab;//学校按钮预制体 public Transform schoolList;//学校预制体列表 public GameObject eventPrefab;//事件按钮预制体 public Transform eventList;//学校预制体列表 public GameObject incidentPrefab;//事件按钮预制体 public Transform incidentList;//学校预制体列表 public ToggleGroup schoolGroup;//学校ToggleGroup public ToggleGroup sceneGroup;//场景ToggleGroup public ToggleGroup eventGroup;//事件ToggleGroup public ToggleGroup incidentGroup;//事件场景ToggleGroup public GameObject scoolSelectBtn;//学校选择按钮 public GameObject sceneLable;//场景选择 public GameObject schoolChoiceLable;//场景名选择界面 public GameObject eventChoiceLable;//事件选择界面 public GameObject incidentLable;//事件场景界面 public Button randomEventBtn;//随机事件按钮 [Header("请选择演练的场景")] public Text text20008; public Text title;//界面标题 public List schoolInfoList = new List();//学校信息 public List eventInfoList = new List();//事件信息 public List incidentInfos = new List();//事件图标信息 public List sceneItemList = new List();//场景信息 public List difficultyList = new List();//游戏难度 public Button continueBtn; public Button submitBtn; public List scenetoggleList = new List(); public List schooltoggleList = new List(); public List eventToggleList = new List(); public List evnetsceneList = new List(); public ToggleGroup toggleGroup; [Header("数据")] public DatePanel datePanel; public Panel panel; public int schoolId { get; set; } public string schoolName { get; set; } public int scnenId { get; set; } public string sceneName { get; set; } public int eventId { get; set; } public string eventName { get; set; } public int idcidentId{ get; set; } public string idcidentName{ get; set; } public string difficulty { get; set; } public string isBuy { get; set; } public bool isSure { get; set; }//判断是否点击了提交按钮 public JSONReader jsonReader; // Start is called before the first frame update void Start() { sceneLable.gameObject.SetActive(true); schoolChoiceLable.gameObject.SetActive(true); eventChoiceLable.gameObject.SetActive(false); incidentLable.gameObject.SetActive(false); InstantiateScenePrefab(); InstantiateSchoolPrefab(); SetEventToggleOpenorClose(incidentInfos); continueBtn.onClick.AddListener(OnClickContinueBtn); SetFirstChoise(scenetoggleList); SetToggleOpenorClose(sceneItemList);//未购买无法选择 SetScloolToggleOpenorClose(schoolInfoList); } // Update is called once per frame void Update() { IsClick(); IsSubmit(); } //动态加载场景选择预制体 public void InstantiateScenePrefab() { foreach (var sceneData in jsonReader.sceneDictionary) { GameObject slot = GameObject.Instantiate(scenePrefab, sceneList); SceneItem item = slot.GetComponent(); switch (sceneData.Value.Type) { case 1: item.sceneName.text = "学校"; break; case 2: // 医院 item.sceneName.text = "医院"; break; case 3: // 建筑工地 item.sceneName.text = "建筑工地"; break; default: // 如果 Type 的值不在 1, 2, 3 中 Debug.LogError("未知的场景类型"); break; } item.sceneId = sceneData.Value.ID; item.sceneType = sceneData.Value.Type; if (item.IsOpen) { item.maskImage.gameObject.SetActive(false); } else { item.maskImage.gameObject.SetActive(true); } Toggle toggle = slot.GetComponent(); if (toggle != null) { toggle.group = sceneGroup; scenetoggleList.Add(toggle); // 使用 Add() 方法添加 Toggle 元素 sceneItemList.Add(item); } } } //动态加载学校选择预制体(这里面的东西需要判断场景的Id来加载对应的场景) public void InstantiateSchoolPrefab() { for (int i = 0; i < 6; i++) { GameObject slot = GameObject.Instantiate(schoolPrefab, schoolList); SchoolInfo item = slot.GetComponent(); item.schoolName.text = "南山中学"; item.schoolId = i; Toggle toggle = slot.GetComponent(); if (toggle != null) { toggle.group = schoolGroup; schooltoggleList.Add(toggle); schoolInfoList.Add(item); } } } //动态加载对应的事件地点 public void InstantiateIncidentPrefab(int eventId) { foreach (var eventData in jsonReader.incidentSiteDictionary) { if (eventData.Key == eventId) { Debug.Log("<<<<<<<<<<<<<<<<(incidentPrefab, incidentList); IncidentInfo item = slot.GetComponent(); item.incidentText.text = eventData.Value.Note; item.incidentID = eventData.Value.ID; Toggle toggle = slot.GetComponent(); if (toggle != null) { // 将 Toggle 添加到 ToggleGroup 中 toggle.group = incidentGroup; toggle.isOn = false; incidentInfos.Add(item); } else { break; } toggle.onValueChanged.AddListener((isSelected) => { if (isSelected) { this.idcidentName = item.incidentText.text; string[] difficulty = eventData.Value.Difficulty.Split('|'); // 确保difficultyList和difficulty的长度匹配 for (int i = 0; i < difficultyList.Count && i < difficulty.Length; i++) { Toggle item = difficultyList[i]; // 获取对应的Toggle DifficultyInfo difficultyInfo = item.gameObject.GetComponent(); if (difficultyInfo == null) { difficultyInfo = item.gameObject.AddComponent(); } // 给每个Toggle设置不同的difficulty值 difficultyInfo.difficulty = int.Parse(difficulty[i]); // 打印出设置的难度值,帮助调试 Debug.Log($"Toggle {i} - Difficulty: {difficultyInfo.difficulty}"); } } }); } } } //点击继续按钮后更换场景图片及名称 public void InstantiateEventPrefab(int id) { text20008.text = sceneName; // 通过 id 获取对应的 sceneData if (jsonReader.sceneDictionary.TryGetValue(id, out var sceneData)) { // 将 IncidentType 按照 '|' 分隔成一个数组 string[] incidentIds = sceneData.IncidentType.Split('|'); // 遍历每个分隔出来的 id foreach (string incidentIdStr in incidentIds) { Debug.Log("incidentIdStr" + incidentIdStr); // 转换字符串为 int 类型 if (int.TryParse(incidentIdStr, out int incidentId)) { // 根据 incidentId 获取对应的事件数据 EventData eventData=jsonReader.GetEvenById(incidentId); Debug.Log("eventData.ID:" + eventData.ID); Debug.Log("eventData.DisasterLocation:" + eventData.DisasterLocation); string[] incidentIds2 = eventData.DisasterLocation.Split('|'); GameObject slot = GameObject.Instantiate(eventPrefab, eventList); EventInfo item = slot.GetComponent(); item.eventId = eventData.ID; item.eventName.text = eventData.Note; if (item.IsOpen) { item.maskImage.gameObject.SetActive(false); } else { item.maskImage.gameObject.SetActive(true); } Toggle toggle = slot.GetComponent(); if (toggle != null) { toggle.group = eventGroup; eventInfoList.Add(item); evnetsceneList.Add(toggle); } toggle.onValueChanged.AddListener((isSelected) => { if (isSelected) // 只有当Toggle被选中时,才调用SelectEventBtn { // 清空事件列表 incidentInfos.Clear(); foreach (Transform child in incidentList) { Destroy(child.gameObject); } this.eventName = item.eventName.text; // 获取 Text 组件的文本 this.eventId = item.eventId; EventData eventData = jsonReader.GetEvenById(this.eventId); foreach (string disasterLocation in incidentIds2) { Debug.Log("disasterLocation>>>>>>>"+ disasterLocation); InstantiateIncidentPrefab(int.Parse(disasterLocation)); OnRandomEventClick(); } createTemplateInfo.Instance.auth_CreateTemplate.sceneId = item.eventId.ToString(); } }); } else { Debug.LogWarning($"Invalid Incident ID format: {incidentIdStr}"); } } } else { Debug.LogWarning($"No scene data found for ID {id}"); } } //学校选择 public void SelectSchoolBtn() { if (isSure) { SchoolInfo gameObject = GetComponentInChildren(); foreach (SchoolInfo item in schoolInfoList) { if (item.gameObject.transform.GetComponent().isOn) { this.schoolId = item.schoolId; this.schoolName = item.schoolName.text; title.text = item.schoolName.text; } } Debug.Log("###############1:" + this.schoolId); Debug.Log("###############2:" + this.schoolName); } } //场景选择 public void SelectSceneBtn() { bool sceneSelected = false; // 检查是否有场景被选择 foreach (SceneItem item in sceneItemList) { // 检查当前的 Toggle 是否被选中 if (item.gameObject.transform.GetComponent().isOn) { // 设置场景名称 this.sceneName = item.sceneName.text; // 获取 Text 组件的文本 this.scnenId = item.sceneId; Debug.Log("------------this.scnenId:" + this.scnenId); createTemplateInfo.Instance.auth_CreateTemplate.sceneId = item.sceneId.ToString(); sceneSelected = true; break; // 找到选中的场景后退出循环 } } } //事件及难度选择 public void SelectEvent() { EventInfo eventInfo = GetComponentInChildren(); foreach (EventInfo item in eventInfoList) { if (item.gameObject.transform.GetComponent().isOn) { this.eventId = item.eventId; this.eventName = item.eventName.text; } } Debug.Log("%%%%%%%%%%%%%1:" + this.eventId); Debug.Log("%%%%%%%%%%%%%2:" + this.eventName); } //随机事件 public void OnRandomEventClick() { // 随机选择一个事件 if (eventInfoList.Count > 1) { int randomIndex = Random.Range(0, eventInfoList.Count); // 取消所有Toggle的选中状态 foreach (Toggle toggle in eventToggleList) { // 先检查toggle是否为null if (toggle != null) { toggle.isOn = false; } } Debug.Log("=++++++++++++++++++++++=" + eventToggleList[randomIndex].GetComponent()); // 选中随机事件 if (eventToggleList[randomIndex] != null && eventToggleList[randomIndex].GetComponent().isOpen != false) { eventToggleList[randomIndex].isOn = true; this.eventName = eventInfoList[randomIndex].eventName.text; // 设置随机选择的事件名称 Debug.Log("已选择随机事件: " + this.eventName); } else { Debug.LogWarning("随机选择的事件 Toggle 为 null!"); } } else { Debug.LogWarning("只有一个事件!!!"); randomEventBtn.gameObject.SetActive(false); } } //游戏难度选择 public void SelsctDifficulty() { auth_createTemplate auth_CreateTemplate = new auth_createTemplate(); foreach (Toggle item in difficultyList) { if (item.isOn) { this.difficulty = item.transform.parent.GetComponentInChildren().text; auth_CreateTemplate.mode = this.difficulty;//给结构体“难度”赋值 } } } //继续按钮,点击后上传数据 public void OnClickContinueBtn() { SelectSchoolBtn(); SelectSceneBtn(); InstantiateEventPrefab(this.scnenId); SetFirstChoise(evnetsceneList); if (continueBtn.interactable) { sceneLable.gameObject.SetActive(false); schoolChoiceLable.gameObject.SetActive(false); eventChoiceLable.gameObject.SetActive(true); incidentLable.gameObject.SetActive(true); } else { Debug.Log("没有选择场景或学校,继续按钮不可用!"); } } //提交按钮,点击上传数据和隐藏界面 public void SubmitBtn() { SelectEvent(); SelsctDifficulty(); //SelectEvnentBtn(); SetDataPanelInfo(); this.gameObject.SetActive(false); panel.gameObject.SetActive(true); } //关闭按钮 public void OnClickCloseBtn() { // 清空事件列表 eventInfoList.Clear(); // 销毁所有已实例化的事件预制体 foreach (Transform child in eventList) { Destroy(child.gameObject); } // 如果需要,也可以清空其他相关信息 evnetsceneList.Clear(); eventId = -1; eventName = string.Empty; if (schoolChoiceLable.gameObject.active == false) { sceneLable.gameObject.SetActive(true); schoolChoiceLable.gameObject.SetActive(true); eventChoiceLable.gameObject.SetActive(false); incidentLable.gameObject.SetActive(false); } else { transform.gameObject.SetActive(false); } } //通过判断Toggle的IsOn是否被打开来判断继续按钮是否置灰 public void IsClick() { bool anyToggleSelected = false; // 检查场景选择 foreach (Toggle toggle in scenetoggleList) { if (toggle.isOn) { anyToggleSelected = true; break; // 如果有一个场景 Toggle 被选中,停止检查 } } // 根据是否有 Toggle 被选中,设置 ContinueBtn 是否可交互 if (continueBtn != null) { continueBtn.interactable = anyToggleSelected; // 如果有选中的 Toggle,继续按钮可交互,否则不可交互 } else { Debug.LogError("ContinueBtn 按钮组件未找到!"); } } //通过判断EventSceneList里面的IsOn是否打开判断提交按钮是否置灰 public void IsSubmit() { bool anyToggleSelected = false; bool anyeventSelected = false; Debug.Log("evnetsceneList>>>>"+ evnetsceneList.Count()); // 检查场景选择 foreach (Toggle toggle in evnetsceneList) { if (toggle.isOn) { anyToggleSelected = true; break; // 如果有一个场景 Toggle 被选中,停止检查 } } foreach (Toggle toggle in eventToggleList) { if (toggle.isOn) { anyeventSelected = true; break; // 如果有一个场景 Toggle 被选中,停止检查 } } // 根据是否有 Toggle 被选中,设置 ContinueBtn 是否可交互 if (submitBtn != null && anyToggleSelected == true&& anyeventSelected==true) { submitBtn.interactable = anyToggleSelected; // 如果有选中的 Toggle,继续按钮可交互,否则不可交互 } else { Debug.LogWarning("提交按钮组件未找到!"); } } //默认选择第一个Toggle public void SetFirstChoise(List toggles) { // 如果有Toggle,则选中第一个 if (toggles.Count() > 0) { toggles[0].isOn = true; } } //场景toggle public void SetToggleOpenorClose(List sceneItems) { foreach (SceneItem item in sceneItems) { if (item.IsOpen == false) { item.GetComponent().interactable = false; if (item.GetComponent().isOn) { item.GetComponent().isOn = false; } } else { item.GetComponent().interactable = true; } } } //学校Toggle public void SetScloolToggleOpenorClose(List sceneItems) { foreach (SchoolInfo item in sceneItems) { if (item.isOpen == false) { item.GetComponent().interactable = true; if (item.GetComponent().isOn) { item.GetComponent().isOn = false; } } else { item.GetComponent().interactable = true; } } } //事件Toggle public void SetEventToggleOpenorClose(List sceneItems) { foreach (IncidentInfo item in sceneItems) { if (item.isOpen == false) { item.GetComponent().interactable = true; if (item.GetComponent().isOn) { item.GetComponent().isOn = false; } } else { item.GetComponent().interactable = true; } } } //设置日期界面的数据 public void SetDataPanelInfo() { datePanel.SchoolText.text = sceneName; datePanel.PlaceText.text = idcidentName; } }