123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using Unity.VisualScripting;
- using UnityEngine;
- using UnityEngine.SceneManagement;
- using UnityEngine.UIElements;
- /* 本代码用来在某些场景中动态切换选择的狗
- * 本代码挂载在 Dog Selector prefeb 下
- */
- public class DogSelectorController : MonoBehaviour
- {
- private List<Label> dogNames = new();
- private VisualElement dogIcon, dogList;
- // Start is called once before the first execution of Update after the MonoBehaviour is created
- void OnEnable()
- {
- var root = GetComponent<UIDocument>().rootVisualElement;
- dogIcon = root.Q<VisualElement>("dogMenu").Q<VisualElement>("dogIcon");
- dogList = root.Q<VisualElement>("dogMenu").Q<VisualElement>("dogList");
- StartCoroutine(DogNameInit()); // 初始化狗的名字,这里当菜单重新激活后再次加载
- dogIcon.RegisterCallback<ClickEvent>(e => DogIconClick(e));
- // 如果用户拥有狗的数量=1,就不显示
- if (UserProperty.dogs.Count == 1)
- {
- dogIcon.visible = false;
- }
- // 如果是playground场景,调整狗的名字的位置
- if (SceneManager.GetActiveScene().name == "Playground")
- {
- var dogMenu = root.Q<VisualElement>("dogMenu");
- dogMenu.style.top = 256;
- }
- }
- // Update is called once per frame
- void Update()
- {
- if (dogNames.Count > 0)
- {
- DogNameDisplayEffect(); // 根据FocusDog调整显示效果
- }
- }
- // 初始化狗的名字
- IEnumerator DogNameInit()
- {
- yield return null;
- dogNames.Clear(); // 清空Label列表
- foreach (Label child in dogList.Children()) // 寻找Label元素加入列表
- {
- dogNames.Add(child);
- }
- // 注入狗的名字,最多注入3只狗
- for (int i = 0; i < Math.Min(UserProperty.dogs.Count, 3); i++)
- {
- int index = i;
- dogNames[i].style.display = DisplayStyle.Flex;
- dogNames[i].text = UserProperty.dogs[i].dog_name;
- dogNames[i].RegisterCallback<ClickEvent>(e => DogNameClick(e, index));
- }
- }
- void DogIconClick(ClickEvent e)
- {
- Debug.Log("DogIconClick");
- if (dogList.visible == false)
- {
- dogList.visible = true;
- }
- else
- {
- dogList.visible = false;
- }
- }
- // 点击狗的名字时候处理,重新读取当前场景
- void DogNameClick(ClickEvent e, int index)
- {
- GameData.focusDog = index;
- if (dogList.visible == true) { dogList.visible = false; }
- // 获取当前场景的名称
- string currentSceneName = SceneManager.GetActiveScene().name;
- // 重新加载当前场景
- SceneManager.LoadScene(currentSceneName);
- }
- // 根据FocusDog调整显示效果
- void DogNameDisplayEffect()
- {
- for (int i = 0; i < UserProperty.dogs.Count; i++)
- {
- if (i == GameData.focusDog)
- {
- dogNames[i].style.backgroundColor = new Color(180, 250, 120, 180);
- }
- else
- {
- dogNames[i].style.backgroundColor = new Color(255, 255, 255, 0);
- }
- }
- }
- }
|