using System.Collections;
using UnityEngine;
///
/// 人类士兵技能:蓄力重斩体系(1/3/6/10 级完整阶梯)
/// 1级【蓄力重斩】:双手持短剑横向重斩,造成 150% 物理伤害(播放 SwordSlashThickWhite 锋利白剑气)
/// 3级【破阵蓄力】:重斩基础伤害提升至 190%,暴击率 +20%
/// 6级【断岳重击】:重斩附带强力震慑,命中直接使目标【眩晕 1.2 秒】(挂 StunStars 眩晕星星,强力打断蓄力)
/// 10级【不屈战魂】:生命值首次跌破 35% 时进入无畏状态(脚底光环 AuraSoftBlue),攻速 +60% 且普攻附带 30% 吸血,持续 6 秒绝地翻盘!
///
public class HumanSoldierSkill : UnitSkill
{
[Header("重斩配置")]
[Tooltip("重斩攻击范围倍率")]
public float slashDistanceBuffer = 0.5f;
[Header("10级不屈战魂配置")]
[Tooltip("战魂触发血量阈值")]
public float undyingHealthThreshold = 0.35f;
[Tooltip("战魂持续时间(秒)")]
public float undyingDuration = 6.0f;
[Tooltip("战魂攻速提升倍率")]
public float undyingAttackSpeedMultiplier = 1.6f;
[Tooltip("战魂额外吸血比例")]
public float undyingLifestealRatio = 0.30f;
[Header("特效资源")]
public GameObject slashVfxPrefab; // 横向白剑气 (SwordSlashThickWhite)
public GameObject undyingAuraPrefab; // 不屈战魂光环 (AuraSoftBlue)
private bool isSkillPending = false;
private bool undyingTriggered = false;
private GameObject activeUndyingAuraInstance;
private Coroutine activeUndyingCoroutine;
private void EnsureUnit()
{
if (unit == null)
{
unit = GetComponent();
}
}
private void Start()
{
EnsureUnit();
if (unit != null)
{
WorldHealthBar healthBar = unit.GetComponent();
if (healthBar != null)
{
healthBar.OnHealthChanged += CheckUndyingTrigger;
}
}
}
///
/// 当能量蓄满时触发:播放人类士兵技能动画(双手横向重斩蓄力)
///
public override void ReleaseSkill()
{
EnsureUnit();
if (unit == null) return;
WorldHealthBar healthBar = unit.GetComponent();
if (healthBar == null || healthBar.IsDead) return;
unit.FaceCurrentTarget(0f);
isSkillPending = true;
// 播放人类士兵技能动画,由 OnSkillHit1 帧触发斩击命中
unit.PlaySkillAnimation(OnSkillAnimationFinished, 1.5f);
Debug.Log($"人类士兵释放技能【蓄力重斩】,等待 OnSkillHit1 命中帧!");
}
///
/// 动画命中帧方法:在横向重斩刀刃挥出的瞬间触发 (OnSkillHit1)
///
public void OnSkillHit1()
{
if (!isSkillPending) return;
isSkillPending = false;
EnsureUnit();
if (unit == null || unit.Target == null) return;
GameObject opponent = unit.Target;
int level = unit.level;
// 1. 播放横向锐利白剑气特效
PlaySlashVfx(opponent);
// 2. 计算技能伤害 (1级 150%, 3级+ 190%)
float baseMultiplier = level >= 3 ? 1.90f : 1.50f;
float finalMultiplier = baseMultiplier;
// 3级解锁:暴击率额外 +20%
float originalCritRate = unit.critRate;
if (level >= 3)
{
unit.critRate += 0.20f;
}
// 3. 施加技能伤害
unit.ApplySkillHit(finalMultiplier, true);
// 恢复原有暴击率
if (level >= 3)
{
unit.critRate = originalCritRate;
}
// 4. 6级解锁【断岳重击】:重斩附带 1.2 秒硬性眩晕打断
if (level >= 6)
{
UnitBase targetUnit = opponent.GetComponentInParent();
if (targetUnit != null && targetUnit.IsAlive)
{
targetUnit.ApplyStun(1.2f);
Debug.Log($"【断岳重击】命中! 目标 {targetUnit.gameObject.name} 眩晕 1.2 秒!");
}
}
Debug.Log($"【蓄力重斩】命中结算! 伤害倍率: {finalMultiplier * 100:F0}% (等级: {level})");
}
///
/// 监测 10 级大招【不屈战魂】:血量首次跌破 35% 时进入无畏战神状态
///
private void CheckUndyingTrigger(float currentHealth, float maxHealth)
{
if (undyingTriggered || unit == null || maxHealth <= 0f) return;
int level = unit.level;
if (level < 10) return;
float ratio = currentHealth / maxHealth;
if (ratio <= undyingHealthThreshold && currentHealth > 0f)
{
undyingTriggered = true;
if (activeUndyingCoroutine != null) StopCoroutine(activeUndyingCoroutine);
activeUndyingCoroutine = StartCoroutine(UndyingSoulRoutine());
}
}
private IEnumerator UndyingSoulRoutine()
{
Debug.Log($"【不屈战魂】爆发! 人类士兵生命告急,开启狂暴反击(攻速+60%,吸血+30%)!");
// 1. 播放脚底战神光环特效 (AuraSoftBlue)
PlayUndyingAuraVfx();
// 2. 施加攻速与吸血增益
float prevLifesteal = unit.lifestealRate;
unit.lifestealRate += undyingLifestealRatio;
unit.MultiplyAttackSpeed(undyingAttackSpeedMultiplier, 3.5f);
yield return new WaitForSeconds(undyingDuration);
// 3. 恢复属性
if (unit != null)
{
unit.lifestealRate = prevLifesteal;
unit.MultiplyAttackSpeed(1f / undyingAttackSpeedMultiplier, 3.5f);
}
if (activeUndyingAuraInstance != null)
{
Destroy(activeUndyingAuraInstance);
activeUndyingAuraInstance = null;
}
Debug.Log($"【不屈战魂】持续时间结束。");
}
private void PlaySlashVfx(GameObject opponent)
{
GameObject prefab = slashVfxPrefab;
#if UNITY_EDITOR
if (prefab == null)
{
prefab = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/TJGeneratorLibEffects/Prefabs/Combat/Sword/Slash/SwordSlashThick/SwordSlashThickWhite.prefab");
}
#endif
if (prefab != null && unit != null)
{
Vector3 spawnPos = unit.transform.position + Vector3.up * 0.9f + unit.transform.forward * 0.8f;
// X轴固定-90度平铺,Y轴为0,将人类士兵的Y轴朝向取反赋值给Z轴旋转
Quaternion rot = Quaternion.Euler(-90f, 0f, -unit.transform.eulerAngles.y);
var vfx = Instantiate(prefab, spawnPos, rot);
vfx.transform.rotation = rot;
vfx.transform.localScale = Vector3.one * 1.3f;
Destroy(vfx, 1.5f);
}
}
private void PlayUndyingAuraVfx()
{
GameObject prefab = undyingAuraPrefab;
#if UNITY_EDITOR
if (prefab == null)
{
prefab = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/TJGeneratorLibEffects/Prefabs/Combat/Magic/Aura Soft/AuraSoftBlue.prefab");
}
#endif
if (prefab != null && unit != null)
{
// AuraSoftBlue 采用 Mesh(Quad) 水平平铺地面,需继承其自身的 -90° (270°) X 轴旋转
Quaternion rot = prefab.transform.rotation;
activeUndyingAuraInstance = Instantiate(prefab, unit.transform.position + Vector3.up * 0.05f, rot);
activeUndyingAuraInstance.transform.rotation = rot;
activeUndyingAuraInstance.transform.SetParent(unit.transform, true);
}
}
private void OnSkillAnimationFinished()
{
isSkillPending = false;
}
private void OnDestroy()
{
if (activeUndyingAuraInstance != null) Destroy(activeUndyingAuraInstance);
if (unit != null)
{
WorldHealthBar healthBar = unit.GetComponent();
if (healthBar != null) healthBar.OnHealthChanged -= CheckUndyingTrigger;
}
}
}