using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI; public class SelectScenePanel : MonoBehaviour { [Header("组件")] public GameObject scenePrefab;//滑动视图预制体 public Transform sceneList;//预制体列表 public GameObject schoolPrefab;//学校按钮预制体 public Transform schoolList;//学校预制体列表 public GameObject eventPrefab;//事件按钮预制体 public Transform eventList;//学校预制体列表 public ToggleGroup schoolGroup;//学校ToggleGroup public ToggleGroup sceneGroup;//场景ToggleGroup public ToggleGroup eventGroup;//事件ToggleGroup public GameObject scoolSelectBtn;//学校选择按钮 public GameObject schoolChoiceLable;//学校选择界面 public GameObject eventChoiceLable;//事件选择界面 public Text title;//界面标题 public List schoolInfoList = new List();//学校信息 public List eventInfoList = new List();//事件信息 public List sceneItemList = new List();//场景信息 public List difficultyList = new List();//游戏难度 public Button continueBtn; public List toggleList=new List(); public List eventToggleList = new List(); //public Toggle[] toggleList; public Toggle[] schooltoggleList; //public Toggle[] eventToggleList; public ToggleGroup toggleGroup; [Header("数据")] public DatePanel datePanel; public int schoolId; public string schoolName; public int scnenId; public string sceneName; public int eventId; public string eventName; public string difficulty; public string isBuy; public JSONReader jsonReader; // Start is called before the first frame update void Start() { schoolChoiceLable.gameObject.SetActive(true); eventChoiceLable.gameObject.SetActive(false); InstantiateScenePrefab(); InstantiateSchoolPrefab(); InstantiateIncidentPrefab(); SetEventToggleOpenorClose(eventInfoList); continueBtn.onClick.AddListener(OnClickContinueBtn); SetFirstChoise(toggleList); SetToggleOpenorClose(sceneItemList);//未购买无法选择 SetScloolToggleOpenorClose(schoolInfoList); } // Update is called once per frame void Update() { IsClick(); } //动态加载场景选择预制体 public void InstantiateScenePrefab() { int index = 0; 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; toggleList[index++] = 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 添加到 ToggleGroup 中 toggle.group = schoolGroup; // 将 Toggle 添加到 schooltoggleList 中 schooltoggleList[i] = toggle; // 将 SchoolInfo 对象添加到 schoolInfos 列表中 schoolInfoList.Add(item); } } } //动态加载事件选择预制体 public void InstantiateIncidentPrefab() { foreach(var eventData in jsonReader.eventDictionary) { GameObject slot = GameObject.Instantiate(eventPrefab, eventList); EventInfo item = slot.GetComponent(); item.eventName.text = eventData.Value.Note; item.eventId = eventData.Value.ID; Toggle toggle = slot.GetComponent(); if (toggle != null) { // 将 Toggle 添加到 ToggleGroup 中 toggle.group = schoolGroup; toggle.isOn = false; // 将 Toggle 添加到 schooltoggleList 中 // 将 SchoolInfo 对象添加到 schoolInfos 列表中 eventInfoList.Add(item); Debug.Log("!!!!!!!!!!!!!!!!!!!!!"+eventInfoList.Count); } } } //点击继续按钮后更换场景图片及名称 public void InstantiateEventPrefab(int id) { // 通过 id 获取对应的 sceneData if (jsonReader.sceneDictionary.TryGetValue(id, out var sceneData)) { // 将 IncidentType 按照 '|' 分隔成一个数组 string[] incidentIds = sceneData.IncidentType.Split('|'); // 遍历每个分隔出来的 id foreach (string incidentIdStr in incidentIds) { // 转换字符串为 int 类型 if (int.TryParse(incidentIdStr, out int incidentId)) { // 根据 incidentId 获取对应的事件数据 if (jsonReader.eventDictionary.TryGetValue(incidentId, out var eventData)) { // 你可以继续处理相关逻辑,比如创建 UI 或设置属性等 GameObject slot = GameObject.Instantiate(scenePrefab, sceneList); SceneItem item = slot.GetComponent(); item.sceneId = eventData.ID; item.sceneName.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; //toggleList.Add(toggle); sceneItemList.Add(item); } } else { Debug.LogWarning($"No event found for Incident ID {incidentId}"); } } else { Debug.LogWarning($"Invalid Incident ID format: {incidentIdStr}"); } } } else { Debug.LogWarning($"No scene data found for ID {id}"); } } //学校选择 public void SelectSchoolBtn() { 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; createTemplateInfo.Instance.auth_CreateTemplate.sceneId = item.sceneId.ToString(); sceneSelected = true; break; // 找到选中的场景后退出循环 } } Debug.Log("---------------" + this.scnenId); Debug.Log("###############3:" + this.schoolId); //IsClick(); } //事件选择 public void SelectEvnentBtn() { bool eventSelected = false; // 检查是否有场景被选择 foreach (EventInfo item in eventInfoList) { // 检查当前的 Toggle 是否被选中 if (item.gameObject.transform.GetComponent().isOn) { // 设置场景名称 this.eventName = item.eventName.text; // 获取 Text 组件的文本 createTemplateInfo.Instance.auth_CreateTemplate.sceneId = item.eventId.ToString(); Debug.Log(this.eventName); eventSelected = 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 > 0) { 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("事件列表为空!"); } } //游戏难度选择 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;//给结构体“难度”赋值 } } //Debug.Log("%%%%%%%%%%%%%3:" + this.difficulty); } //继续按钮,点击后上传数据 public void OnClickContinueBtn() { //IsClick(); // 调用 IsClick 检查是否选中学校和场景 foreach (Transform child in sceneList) { child.gameObject.SetActive(false); } SelectSchoolBtn(); SelectSceneBtn(); InstantiateEventPrefab(this.scnenId); // 如果场景或学校没有选中,则不执行下面的操作 if (continueBtn.interactable) { schoolChoiceLable.gameObject.SetActive(false); eventChoiceLable.gameObject.SetActive(true); } else { Debug.Log("没有选择场景或学校,继续按钮不可用!"); } } //提交按钮,点击上传数据和隐藏界面 public void SubmitBtn() { SelectEvent(); SelsctDifficulty(); SelectEvnentBtn(); SetDataPanelInfo(); this.gameObject.SetActive(false); } //关闭按钮 public void OnClickCloseBtn() { if (schoolChoiceLable.gameObject.active==false) { foreach (Transform child in sceneList) { child.gameObject.SetActive(false); } eventChoiceLable.gameObject.SetActive(false); schoolChoiceLable.gameObject.SetActive(true); InstantiateScenePrefab(); } else { transform.gameObject.SetActive(false); } } //通过判断Toggle的IsOn是否被打开来判断继续按钮是否置灰 public void IsClick() { bool anyToggleSelected = false; // 检查场景选择 foreach (Toggle toggle in toggleList) { Debug.Log("++++++++++++++++++++++++="+toggleList.Count()); if (toggle.isOn) { anyToggleSelected = true; break; // 如果有一个场景 Toggle 被选中,停止检查 } } // 根据是否有 Toggle 被选中,设置 ContinueBtn 是否可交互 if (continueBtn != null) { continueBtn.interactable = anyToggleSelected; // 如果有选中的 Toggle,继续按钮可交互,否则不可交互 } else { Debug.LogError("ContinueBtn 按钮组件未找到!"); } } //默认选择第一个Toggle public void SetFirstChoise(List toggles) { // 获取ToggleGroup中的所有Toggle // 如果有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 (EventInfo 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 = schoolName; datePanel.PlaceText.text = eventName; } }