AchievementUI.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System.Collections.Generic;
  2. using System.Collections;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using UnityEngine.SceneManagement;
  6. public class AchievementUI : MonoBehaviour
  7. {
  8. [Header("UI元素")]
  9. public Transform achievementContainer;
  10. public GameObject achievementItemPrefab;
  11. public Text progressText;
  12. public Button backButton;
  13. [Header("场景名称")]
  14. public string menuSceneName = "MenuScene";
  15. private List<GameObject> achievementItems = new List<GameObject>();
  16. private void Start()
  17. {
  18. if (achievementContainer == null)
  19. {
  20. achievementContainer = transform.Find("Content");
  21. if (achievementContainer == null)
  22. {
  23. achievementContainer = transform.Find("ScrollView/Viewport/Content");
  24. }
  25. }
  26. if (backButton != null)
  27. {
  28. backButton.onClick.AddListener(OnBackClicked);
  29. }
  30. StartCoroutine(LoadAchievementsWhenReady());
  31. }
  32. IEnumerator LoadAchievementsWhenReady()
  33. {
  34. if (AchievementManager.Instance == null)
  35. {
  36. Debug.LogWarning("AchievementManager未找到!");
  37. yield break;
  38. }
  39. float timeout = 5f;
  40. while (!AchievementManager.Instance.IsInitialized && timeout > 0f)
  41. {
  42. timeout -= Time.unscaledDeltaTime;
  43. yield return null;
  44. }
  45. if (!AchievementManager.Instance.IsInitialized)
  46. {
  47. Debug.LogWarning("成就数据加载超时,将显示当前缓存数据");
  48. }
  49. LoadAchievements();
  50. }
  51. void LoadAchievements()
  52. {
  53. if (AchievementManager.Instance == null)
  54. {
  55. Debug.LogWarning("AchievementManager未找到!");
  56. return;
  57. }
  58. foreach (var item in achievementItems)
  59. {
  60. if (item != null)
  61. {
  62. Destroy(item);
  63. }
  64. }
  65. achievementItems.Clear();
  66. List<AchievementData> achievements = AchievementManager.Instance.GetAllAchievements();
  67. int unlockedCount = 0;
  68. foreach (var achievement in achievements)
  69. {
  70. if (achievement.isUnlocked)
  71. {
  72. unlockedCount++;
  73. }
  74. CreateAchievementItem(achievement);
  75. }
  76. if (progressText != null)
  77. {
  78. progressText.text = $"已解锁: {unlockedCount}/{achievements.Count}";
  79. }
  80. }
  81. void CreateAchievementItem(AchievementData achievement)
  82. {
  83. if (achievementContainer == null || achievementItemPrefab == null)
  84. {
  85. Debug.LogWarning("成就容器或预制体未设置!");
  86. return;
  87. }
  88. GameObject itemObj = Instantiate(achievementItemPrefab, achievementContainer);
  89. achievementItems.Add(itemObj);
  90. Transform iconTransform = itemObj.transform.Find("IconImage");
  91. Transform bgTransform = itemObj.transform.Find("BackgroundImage");
  92. Image iconImage = iconTransform != null ? iconTransform.GetComponent<Image>() : null;
  93. Image bgImage = bgTransform != null ? bgTransform.GetComponent<Image>() : null;
  94. if (iconImage != null && achievement.icon != null)
  95. {
  96. iconImage.sprite = achievement.icon;
  97. }
  98. Text[] texts = itemObj.GetComponentsInChildren<Text>();
  99. if (texts.Length >= 3)
  100. {
  101. texts[0].text = achievement.achievementName;
  102. texts[1].text = achievement.description;
  103. texts[2].text = $"进度: {achievement.currentValue}/{achievement.targetValue}";
  104. }
  105. if (achievement.isUnlocked)
  106. {
  107. if (texts.Length >= 3)
  108. {
  109. texts[2].text = "已解锁 ✓";
  110. texts[2].color = Color.green;
  111. }
  112. if (bgImage != null)
  113. {
  114. bgImage.color = new Color(1f, 0.9f, 0.5f);
  115. }
  116. }
  117. else
  118. {
  119. if (bgImage != null)
  120. {
  121. bgImage.color = new Color(0.5f, 0.5f, 0.5f);
  122. }
  123. }
  124. }
  125. void OnBackClicked()
  126. {
  127. Debug.Log("返回菜单");
  128. SceneManager.LoadScene(menuSceneName);
  129. }
  130. }