1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using Unity.VisualScripting;
- using UnityEngine;
- using UnityEngine.SceneManagement;
- using UnityEngine.UIElements;
- /* 本代码用来在某些场景中动态切换选择的狗
- * 本代码挂载在 Dog Selector pre feb 下
- */
- 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()
- //{
- //}
- // 初始化狗的名字
- 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);
- }
- }
|