From 2d3a60767d0cd69c8dec97e39937bcd0c667be1c Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 12 十一月 2025 18:54:57 +0800
Subject: [PATCH] 125 战斗 血条&护盾1护盾2表现

---
 Main/System/Battle/BattleUtility.cs               |   10 +
 Main/System/Battle/Skill/SkillBase.cs             |  163 ++++++++++------------
 Main/Config/PartialConfigs/SkillConfig.Partial.cs |   23 +++
 Main/System/Battle/UIComp/BattleHeroInfoBar.cs    |  100 ++++++++++----
 Main/System/Battle/Define/BattleDmgInfo.cs        |   96 +++----------
 5 files changed, 203 insertions(+), 189 deletions(-)

diff --git a/Main/Config/PartialConfigs/SkillConfig.Partial.cs b/Main/Config/PartialConfigs/SkillConfig.Partial.cs
index 42bcf79..32e1c39 100644
--- a/Main/Config/PartialConfigs/SkillConfig.Partial.cs
+++ b/Main/Config/PartialConfigs/SkillConfig.Partial.cs
@@ -9,6 +9,7 @@
 using System;
 using UnityEngine;
 using LitJson;
+using System.Linq;
 
 public partial class SkillConfig : ConfigBase<int, SkillConfig>
 {
@@ -78,4 +79,26 @@
 		tempDic.TryGetValue(skillLv, out config);
 		return config;
 	}
+
+	public List<int> GetDamageDivide(int _hitIndex)
+	{
+		List<int> damageDivide = new List<int>();
+		if (_hitIndex == 0 && DamageDivide.Length <= 0)
+		{
+			damageDivide.Add(10000);
+		}
+		else
+		{
+			if (DamageDivide.Length <= _hitIndex)
+			{
+				Debug.LogError("鎶�鑳戒激瀹冲垎甯冮厤缃敊璇� skillId: " + SkillID + " hitIndex: " + _hitIndex);
+				damageDivide.Add(10000);
+			}
+			else
+			{
+				damageDivide = DamageDivide[_hitIndex].ToList();
+			}
+		}
+		return damageDivide;
+    }
 }
diff --git a/Main/System/Battle/BattleUtility.cs b/Main/System/Battle/BattleUtility.cs
index 6b8e4e6..091b9fe 100644
--- a/Main/System/Battle/BattleUtility.cs
+++ b/Main/System/Battle/BattleUtility.cs
@@ -296,6 +296,16 @@
         }
         return config.nums[_num - 48];
     }
+
+    public static bool IsHealing(HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
+    {
+        return ((hurt.AttackTypes & (int)ServerDamageType.Recovery) != 0 || 
+                          (hurt.AttackTypes & (int)ServerDamageType.DamageReverse) != 0) &&
+                         (hurt.AttackTypes & (int)ServerDamageType.Damage) == 0 &&
+                         (hurt.AttackTypes & (int)ServerDamageType.Realdamage) == 0 &&
+                         (hurt.AttackTypes & (int)ServerDamageType.SuckHpReverse) == 0 &&
+                         (hurt.AttackTypes & (int)ServerDamageType.SelfHarm) == 0;
+    }
     
     /// <summary>
     /// 灏嗘暣涓妧鑳界殑鎬讳激瀹虫寜鍛戒腑娆℃暟鍜屽垎娈甸厤缃垎閰�
diff --git a/Main/System/Battle/Define/BattleDmgInfo.cs b/Main/System/Battle/Define/BattleDmgInfo.cs
index 42ba730..d709ae5 100644
--- a/Main/System/Battle/Define/BattleDmgInfo.cs
+++ b/Main/System/Battle/Define/BattleDmgInfo.cs
@@ -265,12 +265,6 @@
     public List<long> damageList;
     public List<long> suckHpList;
     public List<long> reflectHpList;
-
-    public long fromShieldValue;
-    public long toShieldValue;
-    public long fromHp;
-    public long toHp;
-
     public BattleDrops battleDrops;
     public HB427_tagSCUseSkill.tagSCUseSkillHurt hurt;
     public int hitIndex;
@@ -278,75 +272,35 @@
     public SkillConfig skillConfig;
     public long maxHp;
 
-    #region Shield Value Calculations
+    //  鎶ょ浘鍊肩殑鍙樺寲搴旇浠庢姢鐩�2寮�濮嬪彉鍖� 涔熷氨鏄 濡傛灉鎶ょ浘2鏈夊�� 鍒欎粠鎶ょ浘2寮�濮嬪彉鍖� 鍚﹀垯浠庢姢鐩�1寮�濮嬪彉鍖�
+    //  鍐嶈�冭檻鎶ょ浘1 濡傛灉鎶ょ浘1鏈夊�� 鍒欎粠鎶ょ浘1寮�濮嬪彉鍖� 鍚﹀垯娌℃湁鎶ょ浘鍙樺寲
+    //  浣嗘槸鍏跺疄鍙互浠庢�昏閲忎笅鎵� 涔熷氨鏄 
+    //  from鎶ょ浘鍊� + from琛�閲� = 琛ㄧ幇鐨勫紑濮�
+    //  to鎶ょ浘鍊� + to琛�閲� = 琛ㄧ幇鐨勭粨鏉�
+    //  杩欐牱灏变笉闇�瑕佸尯鍒嗘姢鐩�1鍜屾姢鐩�2浜� 鍙鍦ㄨ〃鐜颁笂鍋氬ソ灏辫
 
-    public long MaxSheildValue
+    public long fromShieldValue;
+    public long toShieldValue;
+
+    public long fromHp;
+
+    public long toHp;
+
+    //  鏈鎶ょ浘鎶垫秷鍓嶇殑浼ゅ
+    public long totalDamage
     {
         get
         {
-            return hurtObj == null ? 0 : hurtObj.teamHero.maxHp;
+            long total = 0;
+            if (damageList != null)
+            {
+                foreach (var dmg in damageList)
+                {
+                    total += dmg;
+                }
+            }
+
+            return total;
         }
     }
-
-    public long phase1FromShieldValue
-    {
-        get
-        {
-            if (fromShieldValue > 0)
-            {
-                return Mathf.Min((int)fromShieldValue, (int)MaxSheildValue);
-            }
-            else
-            {
-                return 0;
-            }
-        }
-    }
-
-    public long phase1ToShieldValue
-    {
-        get
-        {
-            if (toShieldValue > 0)
-            {
-                return Mathf.Min((int)toShieldValue, (int)MaxSheildValue);
-            }
-            else
-            {
-                return 0;
-            }
-        }
-    }
-
-    public long phase2FromShieldValue
-    {
-        get
-        {
-            if (fromShieldValue > MaxSheildValue)
-            {
-                return fromShieldValue - MaxSheildValue;
-            }
-            else
-            {
-                return 0;
-            }
-        }
-    }
-
-    public long phase2ToShieldValue
-    {
-        get
-        {
-            if (toShieldValue > MaxSheildValue)
-            {
-                return toShieldValue - MaxSheildValue;
-            }
-            else
-            {
-                return 0;
-            }
-        }
-    }
-
-    #endregion
 }
\ No newline at end of file
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 0caf1c4..7fb0d75 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -489,25 +489,6 @@
     // 澶勭悊鍗曚釜鐩爣琚懡涓�:搴旂敤浼ゅ鍜屾柦娉曡�呮晥鏋�
     protected virtual void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
     {
-        // ============ 绗竴姝�:璁$畻浼ゅ鍒嗗竷 ============
-        List<int> damageDivide = new List<int>();
-        if (_hitIndex == 0 && skillConfig.DamageDivide.Length <= 0)
-        {
-            damageDivide.Add(10000);
-        }
-        else
-        {
-            if (skillConfig.DamageDivide.Length <= _hitIndex)
-            {
-                Debug.LogError("鎶�鑳戒激瀹冲垎甯冮厤缃敊璇� skillId: " + skillConfig.SkillID + " hitIndex: " + _hitIndex);
-                damageDivide.Add(10000);
-            }
-            else
-            {
-                damageDivide = skillConfig.DamageDivide[_hitIndex].ToList();
-            }
-        }
-
         // 璁$畻鎬讳激瀹冲拰鍒嗘浼ゅ鍒楄〃
         long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
         List<long> damageList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, totalDamage);
@@ -515,29 +496,21 @@
         long totalSuckHp = suckHp;
         List<long> suckHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, totalSuckHp);
 
+        long totalReflectHp = hurt.BounceHP;
+        List<long> reflectHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, totalReflectHp);
 
-        // ============ 绗簩姝�:鍒锋柊瀹為檯琛�閲� ============
-        long fromHp = target.teamHero.curHp;
-        
-
-
-        // ============澶勭悊鍙嶄激 ===============
-        //  涔熻鎸夋瘡涓�鍑诲钩鍧囩畻 鏈�鍚庤琛ラ綈浼ゅ
-
-        long reflectHp = hurt.BounceHP;
-
-
-        List<long> reflectHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, reflectHp);
-        // long currentSuckHp = suckHp / tagUseSkillAttack.HurtCount;
-
-        // 璁$畻褰撳墠杩欎竴鍑荤殑瀹為檯浼ゅ(鎵�鏈夊垎娈典激瀹充箣鍜�)
+        // 璁$畻褰撳墠杩欎竴鍑荤殑鍚勯」鏁板��
         long currentHitDamage = 0;
         foreach (long dmg in damageList)
         {
             currentHitDamage += dmg;
         }
 
-
+        long currentHitSuckHp = 0;
+        foreach (long suck in suckHpList)
+        {
+            currentHitSuckHp += suck;
+        }
 
         long currentHitReflectHp = 0;
         foreach (long reflect in reflectHpList)
@@ -545,54 +518,74 @@
             currentHitReflectHp += reflect;
         }
 
-        long shieldValue = target.buffMgr.GetShieldValue();
-
-        long remainSheild = shieldValue - currentHitDamage;
-
-        long toShieldValue = Math.Max(0, shieldValue - currentHitDamage);
-
-        long shieldRecieveDamage = shieldValue - toShieldValue;
-
-        // if (shieldValue > 0 && remainSheild >= 0)
-        // {
-        //     currentHitDamage = 0;
-        //     target.buffMgr.ReduceShieldValue(currentHitDamage);
-        // }
-        // else if (shieldValue > 0 && remainSheild < 0)
-        // {
-        //     currentHitDamage = Math.Abs(remainSheild);
-        //     target.buffMgr.ClearShield();
-        // }
-
-        long toHp = fromHp; //Math.Max(0, fromHp - currentHitDamage);
-
+        // ============ 绗簩姝�:鑾峰彇鐩爣褰撳墠鐘舵�� ============
+        long fromHp = target.teamHero.curHp;
+        long maxHp = target.teamHero.maxHp;
+        long fromShieldValue = target.buffMgr.GetShieldValue();
 
         // 鍒ゆ柇鏄不鐤楄繕鏄激瀹�
-        bool isHealing = ((hurt.AttackTypes & (int)ServerDamageType.Recovery) != 0 || 
-                          (hurt.AttackTypes & (int)ServerDamageType.DamageReverse) != 0) &&
-                         (hurt.AttackTypes & (int)ServerDamageType.Damage) == 0 &&
-                         (hurt.AttackTypes & (int)ServerDamageType.Realdamage) == 0 &&
-                         (hurt.AttackTypes & (int)ServerDamageType.SuckHpReverse) == 0 &&
-                         (hurt.AttackTypes & (int)ServerDamageType.SelfHarm) == 0;
+        bool isHealing = BattleUtility.IsHealing(hurt);
+
+        // ============ 绗笁姝�:璁$畻鐩爣琛�閲忓拰鎶ょ浘鍙樺寲 ============
+        long toHp;
+        long toShieldValue;
 
         if (isHealing)
         {
-            // 娌荤枟閫昏緫锛氱洿鎺ュ姞琛�锛屼笉鑰冭檻鎶ょ浘
-            toHp = Math.Min(target.teamHero.maxHp, fromHp + currentHitDamage);
+            // 娌荤枟閫昏緫锛氱洿鎺ュ姞琛�锛屾姢鐩句笉鍙�
+            toHp = Math.Min(maxHp, fromHp + currentHitDamage);
+            toShieldValue = fromShieldValue;
         }
         else
         {
-            // 浼ゅ閫昏緫锛氬厛鎵f姢鐩撅紝鍐嶆墸琛�
-            if (remainSheild < 0)
+            // 浼ゅ閫昏緫锛氬厛鎵f姢鐩撅紝鎶ょ浘涓嶈冻鍐嶆墸琛�
+            if (fromShieldValue >= currentHitDamage)
             {
-                // 鐩捐鎵撶牬
-                toHp = Math.Max(0, fromHp + remainSheild);
+                // 鎶ょ浘瓒冲鎵垮彈鎵�鏈変激瀹�
+                toShieldValue = fromShieldValue - currentHitDamage;
+                toHp = fromHp;
+            }
+            else
+            {
+                // 鎶ょ浘涓嶈冻锛屽厛鎵e畬鎶ょ浘锛屽墿浣欎激瀹虫墸琛�
+                long remainingDamage = currentHitDamage - fromShieldValue;
+                toShieldValue = 0;
+                toHp = Math.Max(0, fromHp - remainingDamage);
             }
         }
 
-
-        // 鏇存柊鐩爣琛�閲�
+        // ============ 绗洓姝�:鏇存柊鐩爣瀹為檯琛�閲� ============
         target.teamHero.curHp = toHp;
+
+        // ============ 绗簲姝�:璁$畻骞舵洿鏂版柦娉曡�呰閲忓彉鍖� ============
+        long casterFromHp = caster.teamHero.curHp;
+        long casterMaxHp = caster.teamHero.maxHp;
+        long casterToHp = casterFromHp;
+
+        // 澶勭悊鍚歌
+        if (currentHitSuckHp > 0)
+        {
+            casterToHp = Math.Min(casterMaxHp, casterToHp + currentHitSuckHp);
+        }
+
+        // 澶勭悊鍙嶄激(鏂芥硶鑰呭彈鍒颁激瀹�)
+        if (currentHitReflectHp > 0)
+        {
+            long casterShieldValue = caster.buffMgr.GetShieldValue();
+            if (casterShieldValue >= currentHitReflectHp)
+            {
+                // 鏂芥硶鑰呮姢鐩捐冻澶�,琛�閲忎笉鍙�
+            }
+            else
+            {
+                // 鏂芥硶鑰呮姢鐩句笉瓒�,鎵h
+                long remainingReflect = currentHitReflectHp - casterShieldValue;
+                casterToHp = Math.Max(0, casterToHp - remainingReflect);
+            }
+        }
+
+        // 鏇存柊鏂芥硶鑰呰閲�
+        caster.teamHero.curHp = casterToHp;
 
 #if UNITY_EDITOR
         BattleDebug.LogError(
@@ -600,37 +593,32 @@
             $"鏀诲嚮鑰�: {caster.teamHero.name}\n" +
             $"鐩爣: {target.teamHero.name}\n" +
             $"鎶�鑳�: {skillConfig.SkillName} (绗瑊_hitIndex}鍑�)\n" +
-            $"浼ゅ: {currentHitDamage} 瀹為檯鍙楀埌浼ゅ: {fromHp-toHp} (鎬讳激瀹�: {totalDamage})\n" +
-            $"鎵夸激鍓嶆姢鐩惧��: {shieldValue}\n" +
-            $"鎵夸激鍚庢姢鐩惧��: {toShieldValue}\n" +
-            $"鎶ょ浘鎵垮彈浼ゅ: {shieldRecieveDamage}\n" +
+            $"浼ゅ: {currentHitDamage} (鎬讳激瀹�: {totalDamage})\n" +
+            $"鍚歌: {currentHitSuckHp}\n" +
             $"鍙嶄激: {currentHitReflectHp}\n" +
-            $"琛�閲忓彉鍖�: {fromHp} -> {toHp}\n" +
-            $"鎶�鑳藉寘閲岀殑琛�閲忔槸: {GeneralDefine.GetFactValue(hurt.CurHP, hurt.CurHPEx)}\n"
+            $"鐩爣鎶ょ浘鍙樺寲: {fromShieldValue} -> {toShieldValue}\n" +
+            $"鐩爣琛�閲忓彉鍖�: {fromHp} -> {toHp}\n" +
+            $"鏂芥硶鑰呰閲忓彉鍖�: {casterFromHp} -> {casterToHp}\n"
         );
 #endif
 
-        
-        bool isLastHit = _hitIndex >= skillConfig.DamageDivide.Length - 1;
-
-        // ============ 绗笁姝�:鑾峰彇涓存椂鏁版嵁(鎺夎惤銆佹浜$瓑) ============
+        // ============ 绗叚姝�:鑾峰彇涓存椂鏁版嵁(鎺夎惤銆佹浜$瓑) ============
         int objID = (int)target.ObjID;
         tempDropList.TryGetValue(objID, out BattleDrops battleDrops);
         tempDeadPackList.TryGetValue(objID, out HB422_tagMCTurnFightObjDead deadPack);
 
-
-        //  鍙傛暟鎵撳寘
+        // ============ 绗竷姝�:鍙傛暟鎵撳寘骞惰皟鐢ㄧ洰鏍嘓urt ============
         BattleHurtParam hurtParam = new BattleHurtParam()
         {
             casterObj = caster,
             hurtObj = target,
             damageList = damageList,
-            suckHpList = suckHpList, //suckHpList,
-            reflectHpList = reflectHpList,
+            suckHpList = suckHpList,      // 鐢ㄤ簬casterDamageList椋樺瓧
+            reflectHpList = reflectHpList, // 鐢ㄤ簬casterDamageList椋樺瓧
             fromHp = fromHp,
             toHp = toHp,
-            maxHp = target.teamHero.maxHp,
-            fromShieldValue = shieldValue,
+            maxHp = maxHp,
+            fromShieldValue = fromShieldValue,
             toShieldValue = toShieldValue,
             battleDrops = battleDrops,
             hurt = hurt,
@@ -639,10 +627,7 @@
             skillConfig = skillConfig
         };
 
-        // ============ 绗洓姝�:鎵ц琛ㄧ幇(椋樺瓧銆佸姩鐢荤瓑) ============
         target.Hurt(hurtParam);
-
-
     }
 
     // 澶勭悊HP鍒锋柊鍖咃紙绠�鍖栭�昏緫锛�
diff --git a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
index d118d33..13400ff 100644
--- a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
+++ b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
@@ -87,11 +87,16 @@
         UpdateXP(battleObject.teamHero.rage, battleObject.teamHero.rage, 100, false);
 
         long shieldValue = battleObject.buffMgr.GetShieldValue();
+        long curHp = battleObject.teamHero.curHp;
         long maxHp = battleObject.teamHero.maxHp;
-        //  绗竴鏉℃姢鐩剧殑鍊兼渶澶у�兼槸褰撳墠鐨凪axHp 绗簩鏉℃姢鐩剧殑鏈�澶у�煎叾瀹炰篃鏄疢axHp 澶氫綑鐨勪笉鍋氭樉绀�
-
-        sliderShield1.value = maxHp > 0 ? Mathf.Min((float)shieldValue, (float)maxHp) / (float)maxHp : 0;
-        sliderShield2.value = maxHp > 0 ? Mathf.Max((float)(shieldValue - maxHp), 0f) / (float)maxHp : 0;
+        
+        // 鎶ょ浘1鐨勫�� = min(褰撳墠琛�閲� + 鎶ょ浘鍊�, maxHp) / maxHp
+        float shield1Value = maxHp > 0 ? Mathf.Min((float)(curHp + shieldValue), (float)maxHp) / (float)maxHp : 0;
+        // 鎶ょ浘2鐨勫�� = max(褰撳墠琛�閲� + 鎶ょ浘鍊� - maxHp, 0) / maxHp
+        float shield2Value = maxHp > 0 ? Mathf.Max((float)(curHp + shieldValue - maxHp), 0f) / (float)maxHp : 0;
+        
+        sliderShield1.value = shield1Value;
+        sliderShield2.value = shield2Value;
     }
     
     public void SetActive(bool active)
@@ -117,12 +122,18 @@
             }
         }
 
-        //  check shield buff
+        // check shield buff
         long shieldValue = battleObject.buffMgr.GetShieldValue();
+        long curHp = battleObject.teamHero.curHp;
         long maxHp = battleObject.teamHero.maxHp;
-        //  绗竴鏉℃姢鐩剧殑鍊兼渶澶у�兼槸褰撳墠鐨凪axHp 绗簩鏉℃姢鐩剧殑鏈�澶у�煎叾瀹炰篃鏄疢axHp 澶氫綑鐨勪笉鍋氭樉绀�
-        sliderShield1.value = maxHp > 0 ? Mathf.Min((float)shieldValue, (float)maxHp) / (float)maxHp : 0;
-        sliderShield2.value = maxHp > 0 ? Mathf.Max((float)(shieldValue - maxHp), 0f) / (float)maxHp : 0;
+        
+        // 鎶ょ浘1鐨勫�� = min(褰撳墠琛�閲� + 鎶ょ浘鍊�, maxHp) / maxHp
+        float shield1Value = maxHp > 0 ? Mathf.Min((float)(curHp + shieldValue), (float)maxHp) / (float)maxHp : 0;
+        // 鎶ょ浘2鐨勫�� = max(褰撳墠琛�閲� + 鎶ょ浘鍊� - maxHp, 0) / maxHp
+        float shield2Value = maxHp > 0 ? Mathf.Max((float)(curHp + shieldValue - maxHp), 0f) / (float)maxHp : 0;
+        
+        sliderShield1.value = shield1Value;
+        sliderShield2.value = shield2Value;
     }
     
     /// <summary>
@@ -251,8 +262,6 @@
         KillTween(ref damageSequence);
 
         long maxHp = dmgInfo.battleHurtParam.maxHp;
-        long fromShield = dmgInfo.battleHurtParam.fromShieldValue;
-        long toShield = dmgInfo.battleHurtParam.toShieldValue;
 
         if (maxHp <= 0)
         {
@@ -261,33 +270,66 @@
             return;
         }
 
-        //  绗竴鏉℃姢鐩剧殑鍊兼渶澶у�兼槸褰撳墠鐨凪axHp 绗簩鏉℃姢鐩剧殑鏈�澶у�煎叾瀹炰篃鏄疢axHp 澶氫綑鐨勪笉鍋氭樉绀�
-        float fromValue1 = (float)dmgInfo.battleHurtParam.phase1FromShieldValue / (float)maxHp;
-        float targetValue1 = (float)dmgInfo.battleHurtParam.phase1ToShieldValue / (float)maxHp;
-
-        float fromValue2 = (float)dmgInfo.battleHurtParam.phase2FromShieldValue / (float)maxHp;
-        float targetValue2 = (float)dmgInfo.battleHurtParam.phase2ToShieldValue / (float)maxHp;
+        long fromHp = dmgInfo.battleHurtParam.fromHp;
+        long toHp = dmgInfo.battleHurtParam.toHp;
+        long fromShield = dmgInfo.battleHurtParam.fromShieldValue;
+        long toShield = dmgInfo.battleHurtParam.toShieldValue;
 
         damageSequence = DOTween.Sequence();
 
-        sliderShield2.value = fromValue2;
-        if (fromValue2 > 0  && fromValue2 != targetValue2)
+        // 璁剧疆鍒濆鍊�
+        if (fromShield > 0)
         {
-            damageSequence.Append(sliderShield2.DOValue(targetValue2, 0.2f));
+            // 鎶ょ浘1鐨勫�� = min(褰撳墠琛�閲� + 褰撳墠鎶ょ浘鍊�, maxHp) / maxHp
+            float fromShield1Value = Mathf.Min((float)(fromHp + fromShield), (float)maxHp) / (float)maxHp;
+            // 鎶ょ浘2鐨勫�� = max(褰撳墠琛�閲� + 褰撳墠鎶ょ浘鍊� - maxHp, 0) / maxHp
+            float fromShield2Value = Mathf.Max((float)(fromHp + fromShield - maxHp), 0f) / (float)maxHp;
+            
+            sliderShield1.value = fromShield1Value;
+            sliderShield2.value = fromShield2Value;
+
+            // 濡傛灉鎶ょ浘2鏈夊�硷紝鍏堟挱鏀炬姢鐩�2鐨勫姩鐢�
+            if (fromShield2Value > 0)
+            {
+                // 璁$畻鎶ょ浘2鐨勫垵濮嬪�煎拰鐩爣鍊�
+                long beginShield2Value = fromHp + fromShield - maxHp;
+                long endShield2Value = Mathf.Max(0, (int)(toHp + toShield - maxHp));
+                
+                float toShield2Value = (float)endShield2Value / (float)maxHp;
+
+                if (Mathf.Abs(fromShield2Value - toShield2Value) > 0.001f)
+                {
+                    damageSequence.Append(sliderShield2.DOValue(toShield2Value, 0.2f));
+                }
+            }
+
+            // 鎾斁鎶ょ浘1鐨勫姩鐢�
+            if (fromShield1Value > 0)
+            {
+                // 璁$畻鎶ょ浘1鐨勭洰鏍囧��
+                float toShield1Value = Mathf.Min((float)(toHp + toShield), (float)maxHp) / (float)maxHp;
+
+                if (Mathf.Abs(fromShield1Value - toShield1Value) > 0.001f)
+                {
+                    damageSequence.Append(sliderShield1.DOValue(toShield1Value, 0.2f));
+                }
+            }
+        }
+        else
+        {
+            // 娌℃湁鎶ょ浘锛岀洿鎺ヨ缃负0
+            sliderShield1.value = 0f;
+            sliderShield2.value = 0f;
         }
 
-        sliderShield1.value = fromValue1;
-        if (fromValue1 > 0 && fromValue1 != targetValue1)
-        {
-            damageSequence.Append(sliderShield1.DOValue(targetValue1, 0.2f));
-        }
+        // 琛�閲忓姩鐢�
+        float fromHpValue = (float)fromHp / (float)maxHp;
+        float toHpValue = (float)toHp / (float)maxHp;
+        
+        sliderHp.value = fromHpValue;
 
-        if (dmgInfo.battleHurtParam.fromHp != dmgInfo.battleHurtParam.toHp)
+        if (Mathf.Abs(fromHpValue - toHpValue) > 0.001f)
         {
-            float fromHpValue = (float)dmgInfo.battleHurtParam.fromHp / (float)maxHp;
-            float toHpValue = (float)dmgInfo.battleHurtParam.toHp / (float)maxHp;
-
-            sliderHp.value = fromHpValue;
             damageSequence.Append(sliderHp.DOValue(toHpValue, 0.2f));
         }
 

--
Gitblit v1.8.0