DogSelectorController.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. // 如果用户拥有狗的数量=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. //}
  39. // 初始化狗的名字
  40. IEnumerator DogNameInit()
  41. {
  42. yield return null;
  43. dogNames.Clear(); // 清空Label列表
  44. foreach (Label child in dogList.Children()) // 寻找Label元素加入列表
  45. {
  46. dogNames.Add(child);
  47. }
  48. // 注入狗的名字,最多注入3只狗
  49. for (int i = 0; i < Math.Min(UserProperty.dogs.Count, 3); i++)
  50. {
  51. int index = i;
  52. dogNames[i].style.display = DisplayStyle.Flex;
  53. dogNames[i].text = UserProperty.dogs[i].dog_name;
  54. dogNames[i].RegisterCallback<ClickEvent>(e => DogNameClick(e, index));
  55. }
  56. }
  57. void DogIconClick(ClickEvent e)
  58. {
  59. Debug.Log("DogIconClick");
  60. if (dogList.visible == false)
  61. {
  62. dogList.visible = true;
  63. }
  64. else
  65. {
  66. dogList.visible = false;
  67. }
  68. }
  69. // 点击狗的名字时候处理,重新读取当前场景
  70. void DogNameClick(ClickEvent e, int index)
  71. {
  72. GameData.focusDog = index;
  73. if (dogList.visible == true) { dogList.visible = false; }
  74. // 获取当前场景的名称
  75. string currentSceneName = SceneManager.GetActiveScene().name;
  76. // 重新加载当前场景
  77. SceneManager.LoadScene(currentSceneName);
  78. }
  79. }