DogSelectorController.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. DogNameDisplayEffect(); // 根据FocusDog调整显示效果
  39. }
  40. // 初始化狗的名字
  41. IEnumerator DogNameInit()
  42. {
  43. yield return null;
  44. dogNames.Clear(); // 清空Label列表
  45. foreach (Label child in dogList.Children()) // 寻找Label元素加入列表
  46. {
  47. dogNames.Add(child);
  48. }
  49. // 注入狗的名字,最多注入3只狗
  50. for (int i = 0; i < Math.Min(UserProperty.dogs.Count, 3); i++)
  51. {
  52. int index = i;
  53. dogNames[i].style.display = DisplayStyle.Flex;
  54. dogNames[i].text = UserProperty.dogs[i].dog_name;
  55. dogNames[i].RegisterCallback<ClickEvent>(e => DogNameClick(e, index));
  56. }
  57. }
  58. void DogIconClick(ClickEvent e)
  59. {
  60. Debug.Log("DogIconClick");
  61. if (dogList.visible == false)
  62. {
  63. dogList.visible = true;
  64. }
  65. else
  66. {
  67. dogList.visible = false;
  68. }
  69. }
  70. // 点击狗的名字时候处理,重新读取当前场景
  71. void DogNameClick(ClickEvent e, int index)
  72. {
  73. GameData.focusDog = index;
  74. if (dogList.visible == true) { dogList.visible = false; }
  75. // 获取当前场景的名称
  76. string currentSceneName = SceneManager.GetActiveScene().name;
  77. // 重新加载当前场景
  78. SceneManager.LoadScene(currentSceneName);
  79. }
  80. // 根据FocusDog调整显示效果
  81. void DogNameDisplayEffect()
  82. {
  83. for (int i = 0; i < UserProperty.dogs.Count; i++)
  84. {
  85. if (i == GameData.focusDog)
  86. {
  87. dogNames[i].style.backgroundColor = new Color(180, 250, 120, 180);
  88. }
  89. else
  90. {
  91. dogNames[i].style.backgroundColor = new Color(255, 255, 255, 0);
  92. }
  93. }
  94. }
  95. }