You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

项目配置步骤

  1. 给刀剑对象添加碰撞体,勾选Is Trigger选项,调整碰撞体尺寸匹配刀剑模型
  2. 在Unity层级管理中新增Enemy层级,所有敌方单位都设置为该层级
  3. 选中MeleeWeapon组件,将Enemy层级赋值给enemyLayer参数
  4. 打开玩家攻击动画的时间轴,添加两个动画事件:
    • 在挥砍动作进入有效判定帧时(刀剑刚要挥出的节点),调用StartAttack方法
    • 在挥砍动作结束后(刀剑收回的节点),调用EndAttack方法

内容的提问来源于stack exchange,提问作者Meer Azmaan Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:45:02