问题描述
我已经设置了Unity 2D项目,以使子弹可以触发并检测和碰撞但不会与环境交互,而我的敌人是对撞机,因此两者都可以。我不知道它们是两种不同类型的事实是否会影响碰撞,但我想我会包括该细节,以防万一。我知道此问题不是由我的子弹移动太快引起的,因为当我调低子弹的速度时,问题仍然存在。我将在此处包括敌人碰撞和子弹碰撞检测的代码:
void OnCollisionEnter2D (Collision2D coll)
{
if (coll.gameObject.tag == "Proj") {
Destroy(gameObject);
Debug.Log("Hit");
}
现在要注意:
void OnTriggerEnter2D(Collider2D hitInfo)
{
if (hitInfo.gameObject.tag == "Enemy") {
Destroy(gameObject);
}
子弹正在检测与敌人的碰撞并自行删除,但敌人并未检测到与子弹的碰撞并自行造成伤害/删除。即使关闭了项目符号代码的Destroy(gameObject)部分,以使其在碰撞时也不会破坏自身,我仍然遇到相同的问题,因此我知道在检测到任何东西之前删除它并不是问题。我希望我的解释足够详尽,希望有人可以帮助我解决此问题。 检查员的图像:https://imgur.com/a/TLfcNcp
解决方法
当您从敌人脚本中调用OnCollisionEnter而不是OnTriggerEnter时,子弹必须是非触发对撞机。
,请显示每个对撞机的设置,OnCollisionEnter2D和OnTriggerEnter2D也是2种不同的东西,它们会在不同的条件下发生,因此请确保您为播放器使用了正确的设置。 / p>
,我对触发器的行为并不十分熟悉,因为我已经开始使用触发器,已经有一段时间了,但是this bit of documentation for MonoBehaviour.OnTriggerEnter2D(Collider2D)是解决问题的重要起点:
仅当其中一个碰撞器还附加了Rigidbody2D时才发送触发事件。
我不能肯定地说,但是您的屏幕截图显示其中没有Rigidbody2D
。
有趣的是,
Collider2D.OnTriggerEnter2D(Collider2D)的文档忽略了指定Rigidbody2D
是必需的。我不确定这意味着什么; MonoBehaviour.OnTriggerEnter(Collider)和Collider.OnTriggerEnter(Collider)(3D类似物)都需要RigidBody
。这两个页面也都声称
如果两个GameObjects都启用了Collider.isTrigger,则不会发生碰撞。
但是,Monobehaviour.OnTriggerEnter2D(Collider2D)
中的示例代码声称将两个2D对撞机都设置为触发器仍然可以调用该函数。