init
This commit is contained in:
		
							
								
								
									
										107
									
								
								history/HealthBarPatch.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								history/HealthBarPatch.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
using HarmonyLib;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using TMPro;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
 | 
			
		||||
namespace test
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Harmony补丁类,用于修改HealthBar的行为
 | 
			
		||||
    /// 添加血量数值显示功能
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    [HarmonyPatch]
 | 
			
		||||
    public class HealthBarPatch
 | 
			
		||||
    {
 | 
			
		||||
        // 使用字典来存储每个HealthBar实例对应的血量文本
 | 
			
		||||
        private static readonly Dictionary<Duckov.UI.HealthBar, TextMeshProUGUI> healthTexts = new Dictionary<Duckov.UI.HealthBar, TextMeshProUGUI>();
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 补丁HealthBar的Setup方法,初始化血量文本
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [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<TextMeshProUGUI>();
 | 
			
		||||
            healthText.fontSize = 12;
 | 
			
		||||
            healthText.color = Color.white;
 | 
			
		||||
            healthText.alignment = TextAlignmentOptions.Center;
 | 
			
		||||
            
 | 
			
		||||
            // 设置文本位置
 | 
			
		||||
            RectTransform rectTransform = textObj.GetComponent<RectTransform>();
 | 
			
		||||
            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);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 补丁HealthBar的Refresh方法,更新血量文本
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [HarmonyPostfix]
 | 
			
		||||
        [HarmonyPatch(typeof(Duckov.UI.HealthBar), "Refresh")]
 | 
			
		||||
        static void RefreshPostfix(Duckov.UI.HealthBar __instance)
 | 
			
		||||
        {
 | 
			
		||||
            UpdateHealthText(__instance);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 补丁HealthBar的Release方法,清理血量文本
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        [HarmonyPostfix]
 | 
			
		||||
        [HarmonyPatch(typeof(Duckov.UI.HealthBar), "Release")]
 | 
			
		||||
        static void ReleasePostfix(Duckov.UI.HealthBar __instance)
 | 
			
		||||
        {
 | 
			
		||||
            CleanupHealthText(__instance);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 清理与HealthBar关联的血量文本
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        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);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 更新血量文本显示
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        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}";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user