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

Unity3d:OnCollisionEnter触发条件与子弹isTrigger需求的矛盾问题

解决Unity子弹触发检测与物理推力的冲突问题

你遇到的是Unity中碰撞事件和触发事件的核心差异导致的问题:

  • OnCollisionEnter 只在两个碰撞体都未开启isTrigger时触发,而且会触发真实的物理碰撞(这就是子弹推动角色的原因)
  • OnTriggerEnter 则只要任意一个碰撞体开启了isTrigger就会触发,并且不会产生物理碰撞的推力,完美匹配你的需求

具体调整步骤如下:

1. 替换碰撞检测方法

把子弹脚本里的 OnCollisionEnter 替换成 OnTriggerEnter,给你个示例代码:

private void OnTriggerEnter(Collider other)
{
    // 这里通过标签判断是否命中角色,记得给角色设置对应的标签
    if (other.CompareTag("Player"))
    {
        // 执行命中逻辑,比如角色扣血、销毁子弹
        Debug.Log("子弹命中角色!");
        Destroy(gameObject);
    }
}

2. 配置组件参数

  • 角色对象:保持Collider不勾选isTrigger,Rigidbody组件正常保留(如果角色不需要受其他物理力影响,可以把Rigidbody的isKinematic设为true,但一般不用)
  • 子弹对象:Collider勾选isTrigger,Rigidbody组件保留;如果子弹不需要受重力、碰撞力等物理影响,建议把Rigidbody的isKinematic设为true,这样能彻底避免任何不必要的物理交互

最后检查下两个对象的Layer碰撞矩阵,确保彼此的触发检测是允许的(默认配置下都是允许的,除非你手动修改过规则)。

这样调整后,既能检测到子弹和角色的碰撞,又不会出现子弹推动角色的情况啦。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:56:07