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

