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

Unity中重叠物体启用/禁用碰撞器时触发OnTriggerEnter/Exit的实现

格斗游戏攻击框(Hitbox)与受击框(Hurtbox)触发逻辑解决方案

方法1:手动碰撞检测(FTG通用方案)

直接跳过Unity物理帧的自动触发逻辑,在启用攻击框的同一帧主动检测范围内的受击框,完全精准控制判定时机,这是格斗游戏最常用的做法。

示例代码:

// 在攻击动画的关键帧调用此方法
public void ActivateHitbox()
{
    // 计算攻击框的世界位置、旋转(基于角色自身坐标偏移)
    Vector3 hitboxWorldPos = transform.TransformPoint(hitboxLocalOffset);
    Quaternion hitboxWorldRot = transform.rotation * hitboxLocalRotation;
    
    // 检测范围内的受击框(需提前设置受击框专属Layer)
    Collider[] detectedHurtboxes = Physics.OverlapBox(
        hitboxWorldPos, 
        hitboxSize / 2, 
        hitboxWorldRot, 
        LayerMask.GetMask("Hurtbox")
    );

    foreach (Collider collider in detectedHurtboxes)
    {
        // 触发受击逻辑
        collider.GetComponent<Hurtbox>()?.TakeDamage(attackDamage);
    }

    // 短暂延迟后关闭攻击框
    Invoke(nameof(DeactivateHitbox), hitboxActiveDuration);
}

void DeactivateHitbox()
{
    hitboxCollider.enabled = false;
}

方法2:强制当前帧执行物理检测

如果非要依赖Unity的Trigger事件,可以在启用攻击框后手动触发物理同步和检测,避免等下一帧才触发OnTriggerStay。

示例代码:

public void EnableHitbox()
{
    hitboxCollider.enabled = true;
    // 同步变换数据,让物理系统获取最新的攻击框位置
    Physics.SyncTransforms();
    // 手动检测一次碰撞
    Collider[] hits = Physics.OverlapCollider(hitboxCollider, LayerMask.GetMask("Hurtbox"));
    foreach (var hit in hits)
    {
        hit.GetComponent<Hurtbox>()?.OnHit();
    }
}

注意:受击框的Rigidbody建议设为isKinematic = true,格斗游戏里受击框不需要物理模拟,只做碰撞判定,避免位置偏移影响判定。

方法3:绑定动画事件触发

在攻击动画的关键帧(比如攻击挥到目标的瞬间)添加动画事件,直接调用攻击框的激活方法,保证判定时机和动画完全对齐,彻底规避帧顺序问题。

操作步骤:

  • 打开Unity动画编辑器,找到攻击动画的对应关键帧
  • 右键添加动画事件,选择攻击脚本中的ActivateHitbox方法

内容的提问来源于stack exchange,提问作者SoMuch SMx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:15:01