using HarmonyLib; using System.Collections.Generic; using TMPro; using UnityEngine; namespace test { /// /// Harmony补丁类,用于修改HealthBar的行为 /// 添加血量数值显示功能 /// [HarmonyPatch] public class HealthBarPatch { // 使用字典来存储每个HealthBar实例对应的血量文本 private static readonly Dictionary healthTexts = new Dictionary(); /// /// 补丁HealthBar的Setup方法,初始化血量文本 /// [HarmonyPostfix] [HarmonyPatch(typeof(Duckov.UI.HealthBar), "Setup")] static void SetupPostfix(Duckov.UI.HealthBar __instance) { // 如果这个HealthBar已经有对应的文本,先清理 if (healthTexts.ContainsKey(__instance)) { CleanupHealthText(__instance); } // 创建血量文本对象 GameObject textObj = new GameObject("HealthText"); textObj.transform.SetParent(__instance.transform); // 设置文本组件 TextMeshProUGUI healthText = textObj.AddComponent(); healthText.fontSize = 12; healthText.color = Color.white; healthText.alignment = TextAlignmentOptions.Center; // 设置文本位置 RectTransform rectTransform = textObj.GetComponent(); rectTransform.anchorMin = new Vector2(0, 0); rectTransform.anchorMax = new Vector2(1, 1); rectTransform.offsetMin = new Vector2(0, 0); rectTransform.offsetMax = new Vector2(0, 0); // 将文本对象存储到字典中 healthTexts[__instance] = healthText; // 更新血量文本 UpdateHealthText(__instance); } /// /// 补丁HealthBar的Refresh方法,更新血量文本 /// [HarmonyPostfix] [HarmonyPatch(typeof(Duckov.UI.HealthBar), "Refresh")] static void RefreshPostfix(Duckov.UI.HealthBar __instance) { UpdateHealthText(__instance); } /// /// 补丁HealthBar的Release方法,清理血量文本 /// [HarmonyPostfix] [HarmonyPatch(typeof(Duckov.UI.HealthBar), "Release")] static void ReleasePostfix(Duckov.UI.HealthBar __instance) { CleanupHealthText(__instance); } /// /// 清理与HealthBar关联的血量文本 /// static void CleanupHealthText(Duckov.UI.HealthBar healthBar) { if (healthTexts.TryGetValue(healthBar, out TextMeshProUGUI textComponent)) { if (textComponent != null && textComponent.gameObject != null) { Object.DestroyImmediate(textComponent.gameObject); } healthTexts.Remove(healthBar); } } /// /// 更新血量文本显示 /// static void UpdateHealthText(Duckov.UI.HealthBar healthBar) { if (!healthTexts.TryGetValue(healthBar, out TextMeshProUGUI textComponent) || textComponent == null || healthBar.target == null) return; float currentHealth = healthBar.target.CurrentHealth; float maxHealth = healthBar.target.MaxHealth; // 显示当前血量和最大血量 textComponent.text = $"{currentHealth:F0}/{maxHealth:F0}"; } } }