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
相关产品推荐
相关产品推荐

