using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///
/// 狂暴狼人技能:嗜血狂暴体系(吸血战坦 · 1/3/6/10 级完整阶梯)
/// 1级【利爪撕裂】:原地撕咬重创造成 150% 物理伤害(立即回复该次伤害 50% 的生命);并激活持续 5 秒的【嗜血状态】,普攻吸血 +30% 且攻速 +25%
/// 3级【血脉沸腾】:嗜血状态延长至 6.5 秒;期间普攻吸血提升至 45%,攻速提升至 35%,撕裂伤害提升至 190%!且单体撕裂附带流血撕口!
/// 6级【背水一战】:保持纯粹单体撕裂;处于嗜血状态时触发【背水一战】:自身血量每降低 10%,受击伤害减免 +3%,普攻吸血额外 +5%(血越残越硬越能吸,真正的打不死战坦)!
/// 10级【不灭狼王】:释放技能爆发狼王之怒,体型放大 1.25 倍(巨狼化)、临时提升 35% 最大生命值上限并获得等额生命回复!技能期间只要击杀敌人,立即瞬间回复 20% 最大生命值并刷新嗜血狂暴时间!
///
public class WerewolfSkill : UnitSkill
{
[Header("动作加速配置")]
[Tooltip("技能动画目标时长(秒)。原动画长达 2.4s,压缩至 1.0s 实现出招速度翻倍以上")]
public float skillTargetDuration = 1.0f;
[Header("特效资源")]
[Tooltip("重抓抓痕特效 (SwordSlashMiniRed)")]
public GameObject clawSlashVfxPrefab;
[Tooltip("受击鲜血爆裂特效 (BloodExplosion)")]
public GameObject bloodHitVfxPrefab;
[Tooltip("10级狼王爆发红光特效 (EnergyExplosionRed)")]
public GameObject wolfKingRageVfxPrefab;
private bool isSkillPending = false;
private bool isBloodthirstActive = false;
private float bloodthirstTimer = 0f;
private float bloodthirstMaxDuration = 5f;
// 属性加成追踪与还原
private float baseBonusLifesteal = 0f;
private float dynamicLossLifesteal = 0f;
private float dynamicLossDamageReduction = 0f;
private float appliedAttackSpeedMultiplier = 1f;
private float temporaryBonusMaxHealth = 0f;
// 10 级体型放大记录与协程
private Vector3 originalModelScale = Vector3.one;
private bool isScaleBoosted = false;
private Coroutine scaleCoroutine;
private void EnsureUnit()
{
if (unit == null)
{
unit = GetComponent();
}
}
protected override void Awake()
{
base.Awake();
EnsureUnit();
if (unit != null)
{
originalModelScale = unit.transform.localScale;
}
}
private void Start()
{
EnsureUnit();
WorldHealthBar.OnUnitKilled -= OnGlobalUnitKilled;
WorldHealthBar.OnUnitKilled += OnGlobalUnitKilled;
}
///
/// 当能量蓄满时触发:播放大招攻击动画
///
public override void ReleaseSkill()
{
EnsureUnit();
if (unit == null) return;
WorldHealthBar healthBar = unit.GetComponent();
if (healthBar == null || healthBar.IsDead) return;
if (unit.Target == null) return;
unit.FaceCurrentTarget(0f);
isSkillPending = true;
// 10级大招:临时提升 35% 最大生命上限并回血 + 体型巨狼化放大 1.25 倍
if (unit.level >= 10)
{
TriggerWolfKingAscension(healthBar);
}
// 技能动作速度翻倍:将 2.4 秒的动画压缩到 1.0 秒播放,撕咬出招迅猛凌厉!
unit.PlaySkillAnimation(OnSkillAnimationFinished, skillTargetDuration);
Debug.Log($"【狂暴狼人】释放大招【利爪撕裂】,动作速度加速 1 倍(时长: {skillTargetDuration:F1}s)!");
}
///
/// 10 级【不灭狼王】爆发:生命上限提升 35% 并回血,模型体型等比放大 1.25 倍
///
private void TriggerWolfKingAscension(WorldHealthBar healthBar)
{
// 每次释放大招,如果尚未获得 35% 加成,则增加 35% 基础生命上限;若已有加成,则直接满额治疗回血!
if (temporaryBonusMaxHealth <= 0f)
{
float bonus = healthBar.maxHealth * 0.35f;
temporaryBonusMaxHealth = bonus;
healthBar.maxHealth += bonus;
healthBar.Heal(bonus);
Debug.Log($"【不灭狼王】狼王真身觉醒! 最大生命上限 +{bonus:F0},当前上限变为: {healthBar.maxHealth:F0}!");
}
else
{
// 已在狼王状态下再次开大:直接享受 35% 巨额生命恢复
healthBar.Heal(temporaryBonusMaxHealth);
Debug.Log($"【不灭狼王】续战愈合! 回复 +{temporaryBonusMaxHealth:F0} 生命值!");
}
// 播放红光爆裂特效
PlayWolfKingVfx();
// 巨狼化体型放大 1.25 倍平滑过渡
if (scaleCoroutine != null) StopCoroutine(scaleCoroutine);
scaleCoroutine = StartCoroutine(SmoothScaleModel(originalModelScale * 1.25f, 0.25f));
isScaleBoosted = true;
}
///
/// 动画帧命中回调(兼容 OnAttackEffect 和 OnSkillHit1)
///
public void OnSkillHit1()
{
ExecuteBiteStrike();
}
public void OnAttackEffect()
{
if (isSkillPending)
{
ExecuteBiteStrike();
}
}
///
/// 实际结算大招单体撕裂重创伤害与启动嗜血狂暴
///
private void ExecuteBiteStrike()
{
if (!isSkillPending) return;
isSkillPending = false;
EnsureUnit();
if (unit == null) return;
WorldHealthBar healthBar = unit.GetComponent();
if (healthBar == null || healthBar.IsDead) return;
int level = unit.level;
// 伤害倍率:1级 150%,3级+ 190% (始终保持纯粹单体撕裂,不分散伤害)
float damageMultiplier = level >= 3 ? 1.90f : 1.50f;
float damage = unit.attackPower * damageMultiplier;
ExecuteSingleBite(damage);
// 激活【嗜血状态】
ActivateBloodthirst(level);
}
private void ExecuteSingleBite(float damage)
{
if (unit.Target == null) return;
GameObject target = unit.Target;
UnitBase targetUnit = target.GetComponentInParent();
WorldHealthBar targetBar = target.GetComponentInParent();
PlayClawAndBloodVfx(target.transform.position + Vector3.up * 0.8f);
float dealtDamage = 0f;
if (targetUnit != null)
{
targetUnit.ReceiveDamage(damage, unit.gameObject);
dealtDamage = damage;
}
else if (targetBar != null)
{
targetBar.TakeDamage(damage, unit.gameObject);
dealtDamage = damage;
}
// 立即回复该次伤害 50% 的生命
WorldHealthBar myBar = unit.GetComponent();
if (myBar != null && dealtDamage > 0f)
{
float healAmount = dealtDamage * 0.5f;
myBar.Heal(healAmount);
Debug.Log($"【利爪撕裂】重创! 造成 {dealtDamage:F1} 伤害,吸血回复 +{healAmount:F1} HP!");
}
}
///
/// 激活/刷新嗜血状态
///
private void ActivateBloodthirst(int level)
{
float duration = level >= 3 ? 6.5f : 5.0f;
float bonusLifesteal = level >= 3 ? 0.45f : 0.30f;
float bonusAttackSpeed = level >= 3 ? 1.35f : 1.25f;
bloodthirstMaxDuration = duration;
bloodthirstTimer = duration;
if (!isBloodthirstActive)
{
isBloodthirstActive = true;
baseBonusLifesteal = bonusLifesteal;
unit.lifestealRate += baseBonusLifesteal;
appliedAttackSpeedMultiplier = bonusAttackSpeed;
unit.MultiplyAttackSpeed(appliedAttackSpeedMultiplier, 3.5f);
}
else
{
// 已在嗜血中时重置持续时间
bloodthirstTimer = duration;
}
Debug.Log($"【嗜血状态激活】 持续 {duration:F1} 秒:吸血 +{bonusLifesteal * 100:F0}%,攻速 +{(bonusAttackSpeed - 1f) * 100:F0}%!");
}
private void Update()
{
if (!isBloodthirstActive || unit == null) return;
bloodthirstTimer -= Time.deltaTime;
// 6级【背水一战】:嗜血期间自身血量越残,额外获得越高额的减伤与吸血
if (unit.level >= 6)
{
UpdateDesperationBuff();
}
if (bloodthirstTimer <= 0f)
{
EndBloodthirst();
}
}
///
/// 6级【背水一战】:自身血量每降低 10%,减伤 +3%,吸血 +5%
///
private void UpdateDesperationBuff()
{
WorldHealthBar healthBar = unit.GetComponent();
if (healthBar == null || healthBar.maxHealth <= 0f) return;
float lostHealthRatio = Mathf.Clamp01(1f - (healthBar.currentHealth / healthBar.maxHealth));
int lostTens = Mathf.FloorToInt(lostHealthRatio * 10f); // 每 10%
float targetReduction = lostTens * 0.03f; // 每 10% 减伤 +3% (最高 27%)
float targetExtraLifesteal = lostTens * 0.05f; // 每 10% 吸血 +5% (最高 45%)
// 差量动态更新,避免死循环累加
float deltaReduction = targetReduction - dynamicLossDamageReduction;
unit.damageReductionRate += deltaReduction;
dynamicLossDamageReduction = targetReduction;
float deltaLifesteal = targetExtraLifesteal - dynamicLossLifesteal;
unit.lifestealRate += deltaLifesteal;
dynamicLossLifesteal = targetExtraLifesteal;
}
private void EndBloodthirst()
{
if (!isBloodthirstActive) return;
isBloodthirstActive = false;
bloodthirstTimer = 0f;
// 还原属性
if (unit != null)
{
unit.lifestealRate = Mathf.Max(0f, unit.lifestealRate - baseBonusLifesteal - dynamicLossLifesteal);
unit.damageReductionRate = Mathf.Max(0f, unit.damageReductionRate - dynamicLossDamageReduction);
if (appliedAttackSpeedMultiplier > 1f)
{
unit.MultiplyAttackSpeed(1f / appliedAttackSpeedMultiplier, 3.5f);
}
// 10级大招临时提升的生命上限还原
if (temporaryBonusMaxHealth > 0f)
{
WorldHealthBar bar = unit.GetComponent();
if (bar != null)
{
bar.maxHealth = Mathf.Max(1f, bar.maxHealth - temporaryBonusMaxHealth);
bar.currentHealth = Mathf.Min(bar.currentHealth, bar.maxHealth);
}
temporaryBonusMaxHealth = 0f;
}
// 还原体型大小
if (isScaleBoosted)
{
if (scaleCoroutine != null) StopCoroutine(scaleCoroutine);
scaleCoroutine = StartCoroutine(SmoothScaleModel(originalModelScale, 0.3f));
isScaleBoosted = false;
}
}
baseBonusLifesteal = 0f;
dynamicLossLifesteal = 0f;
dynamicLossDamageReduction = 0f;
appliedAttackSpeedMultiplier = 1f;
Debug.Log($"【嗜血状态结束】属性与体型恢复正常。");
}
///
/// 10级【不灭狼王】:技能期间击杀敌人,立即回复 20% 最大生命值并刷新嗜血时间!
///
private void OnGlobalUnitKilled(GameObject victim, GameObject killer)
{
if (!isBloodthirstActive || unit == null || killer == null) return;
if (unit.level < 10) return;
// 判断击杀者是否是自己
if (killer == unit.gameObject || killer.transform.IsChildOf(unit.transform))
{
WorldHealthBar myBar = unit.GetComponent();
if (myBar != null && !myBar.IsDead)
{
float heal = myBar.maxHealth * 0.20f;
myBar.Heal(heal);
// 重置/刷新嗜血持续时间
bloodthirstTimer = bloodthirstMaxDuration;
Debug.Log($"【不灭狼王·猎杀连环】! 击杀 {victim.name},立即回复 20% 生命 (+{heal:F0}) 并刷新狂暴状态!");
}
}
}
private IEnumerator SmoothScaleModel(Vector3 targetScale, float duration)
{
if (unit == null) yield break;
Vector3 from = unit.transform.localScale;
float elapsed = 0f;
while (elapsed < duration)
{
elapsed += Time.deltaTime;
float t = Mathf.Clamp01(elapsed / duration);
if (unit != null)
{
unit.transform.localScale = Vector3.Lerp(from, targetScale, Mathf.SmoothStep(0f, 1f, t));
}
yield return null;
}
if (unit != null) unit.transform.localScale = targetScale;
}
private void PlayClawAndBloodVfx(Vector3 position)
{
// 1. 鲜血飞溅
GameObject bloodPrefab = bloodHitVfxPrefab;
#if UNITY_EDITOR
if (bloodPrefab == null)
{
bloodPrefab = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/TJGeneratorLibEffects/Prefabs/Combat/Blood/Red/BloodExplosion.prefab");
}
#endif
if (bloodPrefab != null)
{
var vfx = Instantiate(bloodPrefab, position, Quaternion.identity);
vfx.transform.localScale = Vector3.one * 1.5f;
Destroy(vfx, 1.5f);
}
// 2. 红色抓痕
GameObject slashPrefab = clawSlashVfxPrefab;
#if UNITY_EDITOR
if (slashPrefab == null)
{
slashPrefab = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/TJGeneratorLibEffects/Prefabs/Combat/Sword/Slash/SwordSlashMini/SwordSlashMiniRed.prefab");
}
#endif
if (slashPrefab != null && unit != null)
{
Quaternion rot = Quaternion.Euler(-90f, 0f, -unit.transform.eulerAngles.y);
var vfx = Instantiate(slashPrefab, position, rot);
vfx.transform.localScale = Vector3.one * 1.4f;
Destroy(vfx, 1.0f);
}
}
private void PlayWolfKingVfx()
{
GameObject vfxPrefab = wolfKingRageVfxPrefab;
#if UNITY_EDITOR
if (vfxPrefab == null)
{
vfxPrefab = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/TJGeneratorLibEffects/Prefabs/Combat/Explosions/EnergyExplosion/EnergyExplosionRed.prefab");
}
#endif
if (vfxPrefab != null && unit != null)
{
Vector3 pos = unit.transform.position + Vector3.up * 0.8f;
var vfx = Instantiate(vfxPrefab, pos, Quaternion.identity);
vfx.transform.localScale = Vector3.one * 1.5f;
Destroy(vfx, 2.0f);
}
}
private void OnSkillAnimationFinished()
{
if (isSkillPending)
{
ExecuteBiteStrike(); // 容错兜底:若动画结束仍未收到 Event,强制结算撕咬
}
}
private void OnDestroy()
{
WorldHealthBar.OnUnitKilled -= OnGlobalUnitKilled;
EndBloodthirst();
}
}