Unity中如何实现近战伤害判定 求仅攻击状态生效的刀剑近战脚本
Unity 近战刀剑伤害检测实现方案
核心修复逻辑
- 新增攻击状态开关,仅在攻击动作的有效判定区间开启伤害检测
- 增加已命中目标缓存,避免单次攻击对同一敌方重复结算伤害
- 用动画事件控制检测开关的启停,完全匹配攻击动作的生效时机
完整实现代码
1. 刀剑挂载脚本 MeleeWeapon.cs
using UnityEngine; using System.Collections.Generic; public class MeleeWeapon : MonoBehaviour { [Header("攻击配置")] public int attackDamage = 25; // 仅对指定层级的对象触发伤害 public LayerMask enemyLayer; // 攻击状态标记 private bool _isAttacking = false; // 缓存单次攻击已命中的目标,避免重复判定 private readonly HashSet<GameObject> _hitEnemies = new HashSet<GameObject>(); /// <summary> /// 攻击开始时由动画事件调用,开启伤害判定 /// </summary> public void StartAttack() { _hitEnemies.Clear(); _isAttacking = true; } /// <summary> /// 攻击结束时由动画事件调用,关闭伤害判定 /// </summary> public void EndAttack() { _isAttacking = false; } private void OnTriggerEnter(Collider other) { // 非攻击状态/非敌方单位/已命中过的单位 均跳过伤害结算 if (!_isAttacking || (enemyLayer.value & (1 << other.gameObject.layer)) == 0 || _hitEnemies.Contains(other.gameObject)) { return; } // 触发敌方受伤逻辑 if (other.TryGetComponent(out EnemyHealth enemyHealth)) { enemyHealth.TakeDamage(attackDamage); _hitEnemies.Add(other.gameObject); } } }
2. 敌方血量脚本 EnemyHealth.cs
using UnityEngine; public class EnemyHealth : MonoBehaviour { public int maxHealth = 100; private int _currentHealth; private void Awake() { _currentHealth = maxHealth; } public void TakeDamage(int damage) { _currentHealth -= damage; if (_currentHealth <= 0) { Die(); } } private void Die() { // 自定义敌方死亡逻辑,如播放死亡动画、掉落奖励等 Destroy(gameObject); } }
项目配置步骤
- 给刀剑对象添加碰撞体,勾选
Is Trigger选项,调整碰撞体尺寸匹配刀剑模型 - 在Unity层级管理中新增
Enemy层级,所有敌方单位都设置为该层级 - 选中
MeleeWeapon组件,将Enemy层级赋值给enemyLayer参数 - 打开玩家攻击动画的时间轴,添加两个动画事件:
- 在挥砍动作进入有效判定帧时(刀剑刚要挥出的节点),调用
StartAttack方法 - 在挥砍动作结束后(刀剑收回的节点),调用
EndAttack方法
- 在挥砍动作进入有效判定帧时(刀剑刚要挥出的节点),调用
内容的提问来源于stack exchange,提问作者Meer Azmaan Ali
相关产品推荐
相关产品推荐

