_xiaofang/xiaofang/Assets/Script/UI/PanelUI/SelectScenePanel.cs
2024-12-01 19:27:05 +08:00

520 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<SchoolInfo> schoolInfoList = new List<SchoolInfo>();//学校信息
public List<EventInfo> eventInfoList = new List<EventInfo>();//事件信息
public List<SceneItem> sceneItemList = new List<SceneItem>();//场景信息
public List<Toggle> difficultyList = new List<Toggle>();//游戏难度
public Button continueBtn;
public List<Toggle> toggleList=new List<Toggle>();
public List<Toggle> eventToggleList = new List<Toggle>();
//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<GameObject>(scenePrefab, sceneList);
SceneItem item = slot.GetComponent<SceneItem>();
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<Toggle>();
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<GameObject>(schoolPrefab, schoolList);
SchoolInfo item = slot.GetComponent<SchoolInfo>();
item.schoolName.text = "南山中学";
item.schoolId = i;
Toggle toggle = slot.GetComponent<Toggle>();
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<GameObject>(eventPrefab, eventList);
EventInfo item = slot.GetComponent<EventInfo>();
item.eventName.text = eventData.Value.Note;
item.eventId = eventData.Value.ID;
Toggle toggle = slot.GetComponent<Toggle>();
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<GameObject>(scenePrefab, sceneList);
SceneItem item = slot.GetComponent<SceneItem>();
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<Toggle>();
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<SchoolInfo>();
foreach (SchoolInfo item in schoolInfoList)
{
if (item.gameObject.transform.GetComponent<Toggle>().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<Toggle>().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<Toggle>().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<EventInfo>();
foreach (EventInfo item in eventInfoList)
{
if (item.gameObject.transform.GetComponent<Toggle>().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<EventInfo>());
// 选中随机事件
if (eventToggleList[randomIndex] != null&& eventToggleList[randomIndex].GetComponent<EventInfo>().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>().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<Toggle> toggles)
{
// 获取ToggleGroup中的所有Toggle
// 如果有Toggle则选中第一个
if (toggles.Count() > 0)
{
toggles[0].isOn = true;
}
}
//场景toggle
public void SetToggleOpenorClose(List<SceneItem> sceneItems)
{
foreach (SceneItem item in sceneItems)
{
if (item.IsOpen==false)
{
item.GetComponent<Toggle>().interactable = false;
if (item.GetComponent<Toggle>().isOn)
{
item.GetComponent<Toggle>().isOn = false;
}
}
else
{
item.GetComponent<Toggle>().interactable = true;
}
}
}
//学校Toggle
public void SetScloolToggleOpenorClose(List<SchoolInfo> sceneItems)
{
foreach (SchoolInfo item in sceneItems)
{
if (item.isOpen == false)
{
item.GetComponent<Toggle>().interactable = true;
if (item.GetComponent<Toggle>().isOn)
{
item.GetComponent<Toggle>().isOn = false;
}
}
else
{
item.GetComponent<Toggle>().interactable = true;
}
}
}
//事件Toggle
public void SetEventToggleOpenorClose(List<EventInfo> sceneItems)
{
foreach (EventInfo item in sceneItems)
{
if (item.isOpen == false)
{
item.GetComponent<Toggle>().interactable = true;
if (item.GetComponent<Toggle>().isOn)
{
item.GetComponent<Toggle>().isOn = false;
}
}
else
{
item.GetComponent<Toggle>().interactable = true;
}
}
}
//设置日期界面的数据
public void SetDataPanelInfo()
{
datePanel.SchoolText.text = schoolName;
datePanel.PlaceText.text = eventName;
}
}