DogSelectorController.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Unity.VisualScripting;
  5. using UnityEngine;
  6. using UnityEngine.SceneManagement;
  7. using UnityEngine.UIElements;
  8. /* 本代码用来在某些场景中动态切换选择的狗
  9. * 本代码挂载在 Dog Selector pre feb 下
  10. */
  11. public class DogSelectorController : MonoBehaviour
  12. {
  13. private List<Label> dogNames = new();
  14. private VisualElement dogIcon, dogList;
  15. // Start is called once before the first execution of Update after the MonoBehaviour is created
  16. void OnEnable()
  17. {
  18. var root = GetComponent<UIDocument>().rootVisualElement;
  19. dogIcon = root.Q<VisualElement>("dogMenu").Q<VisualElement>("dogIcon");
  20. dogList = root.Q<VisualElement>("dogMenu").Q<VisualElement>("dogList");
  21. StartCoroutine(DogNameInit()); // 初始化狗的名字,这里当菜单重新激活后再次加载
  22. dogIcon.RegisterCallback<ClickEvent>(e => DogIconClick(e));
  23. }
  24. // Update is called once per frame
  25. //void Update()
  26. //{
  27. //}
  28. // 初始化狗的名字
  29. IEnumerator DogNameInit()
  30. {
  31. yield return null;
  32. dogNames.Clear(); // 清空Label列表
  33. foreach (Label child in dogList.Children()) // 寻找Label元素加入列表
  34. {
  35. dogNames.Add(child);
  36. }
  37. // 注入狗的名字,最多注入3只狗
  38. for (int i = 0; i < Math.Min(UserProperty.dogs.Count, 3); i++)
  39. {
  40. int index = i;
  41. dogNames[i].style.display = DisplayStyle.Flex;
  42. dogNames[i].text = UserProperty.dogs[i].dog_name;
  43. dogNames[i].RegisterCallback<ClickEvent>(e => DogNameClick(e, index));
  44. }
  45. }
  46. void DogIconClick(ClickEvent e)
  47. {
  48. Debug.Log("DogIconClick");
  49. if (dogList.visible == false)
  50. {
  51. dogList.visible = true;
  52. }
  53. else
  54. {
  55. dogList.visible = false;
  56. }
  57. }
  58. // 点击狗的名字时候处理,重新读取当前场景
  59. void DogNameClick(ClickEvent e, int index)
  60. {
  61. GameData.focusDog = index;
  62. if (dogList.visible == true) { dogList.visible = false; }
  63. // 获取当前场景的名称
  64. string currentSceneName = SceneManager.GetActiveScene().name;
  65. // 重新加载当前场景
  66. SceneManager.LoadScene(currentSceneName);
  67. }
  68. }