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; } } }