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

Unity射击游戏子弹与敌人触发碰撞器异常碰撞问题求助

问题根源与解决方案

核心问题在于:触发碰撞器(isTrigger=true)不会触发OnCollisionEnter事件,只会触发OnTriggerEnter/Stay/Exit系列事件。你的代码只处理了普通碰撞逻辑,敌人的触发碰撞器没被正确识别,反而因物体刚体设置异常导致子弹物理行为出错。

1. 拆分碰撞与触发事件逻辑

分别用两个函数处理不同碰撞类型:

// 处理普通碰撞(非触发碰撞器,生成弹痕)
private void OnCollisionEnter(Collision other)
{
    ContactPoint contact = other.GetContact(0);
    GameObject bulletDecalg = GameObject.Instantiate(bulletDecal, contact.point + contact.normal * 0.001f, Quaternion.LookRotation(contact.normal));
    Destroy(bulletDecalg, 3);
    Destroy(gameObject);
}

// 处理触发碰撞(敌人的攻击判定碰撞器,执行伤害)
private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Enemy"))
    {
        Debug.Log("Enemy got owned");
        other.GetComponent<EnemyCont>().TakeDamage(bulletDamage);
        Destroy(gameObject);
    }
}

2. 修正刚体与碰撞器设置

  • 敌人端:确保攻击判定碰撞器isTrigger=true,且敌人根物体带有刚体组件——如果敌人是静态物体,可勾选Is Kinematic;如果是动态敌人,保持Is Kinematic=false即可,没有刚体的触发碰撞器无法和动态刚体(子弹)正常交互。
  • 子弹端:使用动态刚体(Is Kinematic=false),碰撞检测模式设为Continuous Dynamic(避免高速子弹穿透敌人),同时子弹自身的碰撞器要保持isTrigger=false(才能触发普通碰撞事件)。

3. 修复原代码语法错误

原代码中if (tag == "Enemy")块缺少闭合的},这会直接导致编译失败,必须补上。另外建议用other.CompareTag("Enemy")代替先赋值tag再判断,效率更高且能避免空引用风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:47:18