DogSelectorController.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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 prefeb 下
  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. // 如果用户拥有狗的数量=1,就不显示
  24. if (UserProperty.dogs.Count == 1)
  25. {
  26. dogIcon.visible = false;
  27. }
  28. // 如果是playground场景,调整狗的名字的位置
  29. if (SceneManager.GetActiveScene().name == "Playground")
  30. {
  31. var dogMenu = root.Q<VisualElement>("dogMenu");
  32. dogMenu.style.top = 256;
  33. }
  34. }
  35. // Update is called once per frame
  36. void Update()
  37. {
  38. if (dogNames.Count > 0)
  39. {
  40. DogNameDisplayEffect(); // 根据FocusDog调整显示效果
  41. }
  42. }
  43. // 初始化狗的名字
  44. IEnumerator DogNameInit()
  45. {
  46. yield return null;
  47. dogNames.Clear(); // 清空Label列表
  48. foreach (Label child in dogList.Children()) // 寻找Label元素加入列表
  49. {
  50. dogNames.Add(child);
  51. }
  52. // 注入狗的名字,最多注入3只狗
  53. for (int i = 0; i < Math.Min(UserProperty.dogs.Count, 3); i++)
  54. {
  55. int index = i;
  56. dogNames[i].style.display = DisplayStyle.Flex;
  57. dogNames[i].text = UserProperty.dogs[i].dog_name;
  58. dogNames[i].RegisterCallback<ClickEvent>(e => DogNameClick(e, index));
  59. }
  60. }
  61. void DogIconClick(ClickEvent e)
  62. {
  63. Debug.Log("DogIconClick");
  64. if (dogList.visible == false)
  65. {
  66. dogList.visible = true;
  67. }
  68. else
  69. {
  70. dogList.visible = false;
  71. }
  72. }
  73. // 点击狗的名字时候处理,重新读取当前场景
  74. void DogNameClick(ClickEvent e, int index)
  75. {
  76. GameData.focusDog = index;
  77. if (dogList.visible == true) { dogList.visible = false; }
  78. // 获取当前场景的名称
  79. string currentSceneName = SceneManager.GetActiveScene().name;
  80. // 重新加载当前场景
  81. SceneManager.LoadScene(currentSceneName);
  82. }
  83. // 根据FocusDog调整显示效果
  84. void DogNameDisplayEffect()
  85. {
  86. for (int i = 0; i < UserProperty.dogs.Count; i++)
  87. {
  88. if (i == GameData.focusDog)
  89. {
  90. dogNames[i].style.backgroundColor = new Color(180, 250, 120, 180);
  91. }
  92. else
  93. {
  94. dogNames[i].style.backgroundColor = new Color(255, 255, 255, 0);
  95. }
  96. }
  97. }
  98. }