Unity Inspector添加碰撞销毁对象:数据类型遗忘与代码问题排查
嘿,我来帮你搞定这个Unity代码的小问题~
问题分析与修正方案
1. 确定正确的offender数据类型
你想要在Inspector面板里拖入一个GameObject,并且判断碰撞对象是否是它,那offender的类型绝对不能是int(整数类型根本没法关联游戏对象),推荐选下面两种类型之一:
public Collider offender;:最贴合你原代码的判断逻辑,Inspector里直接拖入目标对象即可(Unity会自动关联它身上的Collider组件)public GameObject offender;:如果需要关联整个游戏对象,后续代码里要调整判断逻辑(对比collision.gameObject而非collision.collider)
2. 原代码的问题排查
你的原代码有几个关键问题:
- 核心类型错误:
public int offender;完全不符合需求,int是数值类型,没法在Inspector里绑定游戏对象,这是你没法实现功能的根本原因。 - 逻辑匹配问题:如果选了
GameObject类型的offender,原代码里collision.collider == offender永远不会成立——因为Collider和GameObject是两种不同的组件/对象类型,必须改成collision.gameObject == offender。 - 碰撞条件缺失:要让
OnCollisionEnter触发,必须满足:- 碰撞双方都带有Collider组件(至少有一个不是静态的,或者其中一个带有Rigidbody组件)
- 两个Collider的
Is Trigger都没有勾选(如果勾选了,要改用OnTriggerEnter方法)
修正后的代码示例
这里给你两种可选的修正版本,按需选择:
版本1:用Collider类型(推荐)
public Collider offender; // 现在可以在Inspector里拖入目标对象啦 private void OnCollisionEnter(UnityEngine.Collision collision) { // 用CompareTag比直接==标签更安全,拼写错误会有编辑器警告 if (collision.collider.CompareTag("Bolt") || collision.collider == offender) { Destroy(gameObject); // 销毁当前脚本挂载的对象 } }
版本2:用GameObject类型
public GameObject offender; // Inspector里拖入目标GameObject private void OnCollisionEnter(UnityEngine.Collision collision) { if (collision.collider.CompareTag("Bolt") || collision.gameObject == offender) { Destroy(gameObject); } }
小提醒
对比标签的时候,尽量用CompareTag()方法代替直接的==,前者在你标签拼写错误时会在Unity编辑器里给出警告,更容易排查问题~
内容的提问来源于stack exchange,提问作者Ollaster
相关产品推荐
相关产品推荐

