Unity中Sprite与Cube碰撞失效求助:碰撞时未销毁Princess Sprite
我来帮你排查下这个碰撞逻辑没生效的问题!你已经给Sprite加了Rigidbody和Box Collider,但Cube还是直接穿过去,OnCollisionEnter没触发,大概率是这几个细节没设置对:
检查Cube的碰撞体配置
因为Cube是代码生成的,一定要确认它身上添加了Collider组件(比如BoxCollider),而且不要勾选Is Trigger。如果Cube没有Collider,物理引擎根本不会识别它的碰撞。另外,如果Cube被设置为Static(层级面板顶部的Static勾选了),也可能干扰碰撞检测,除非你在Sprite的Rigidbody里调整了碰撞模式。修正Sprite的Rigidbody设置
看看Sprite的Rigidbody有没有勾选Is Kinematic?如果勾了这个选项,物体就会忽略物理碰撞,完全不会触发OnCollisionEnter。你需要把这个选项取消掉,除非你打算用触发式检测(后面会提到)。核对Layer碰撞矩阵
打开Edit → Project Settings → Physics,找到Layer Collision Matrix,确保Sprite所在的层和Cube所在的层是允许互相碰撞的。如果这两个层被设置为不碰撞,就算都有Collider也白搭。确认脚本挂载位置
你写的OnCollisionEnter代码是挂在Sprite(princess)上的对吧?要是不小心挂到Cube或者其他物体上,逻辑肯定不会生效。检查下脚本的附着对象是不是princess。试试触发式检测(备选方案)
如果上面的都排查过还是不行,可以换用触发式检测:把Sprite或者Cube其中一个的Collider勾选Is Trigger,然后把代码改成下面这样:
private void OnTriggerEnter(Collider other) { if (other.gameObject.name == "Cube") { Destroy(this.gameObject); } }
另外提个小建议:用物体名称判断碰撞对象容易出错,比如生成的Cube可能自动带上后缀(比如Cube(1)),或者名字拼写有误。更可靠的方式是给Cube设置一个专属Tag(比如EnemyCube),然后用other.CompareTag("EnemyCube")来判断,这样容错性更高。
内容的提问来源于stack exchange,提问作者fwefwf

