gpt4 book ai didi

c# - Unity Physics2D.IgnoreCollision 无法正常运行

转载 作者:太空宇宙 更新时间:2023-11-03 22:40:11 25 4
gpt4 key购买 nike

我试图让两个对象相互忽略。我试图实现 Physics2D.IgnoreCollision 代码,但就目前而言,第一个物体从天而降,并且 A) 直接击中下面的物体,在那里停留一秒钟,然后继续向下移动屏幕,或者 B)如果它从一个侧面的角度撞到它,只会瞥一眼下面的物体。我希望两者完全忽略对方。

这是我的代码:

void OnCollisionEnter2D(Collision2D collision) {
if (collision.gameObject.tag == "obj") {
Physics2D.IgnoreCollision(collision.gameObject.GetComponent<Collider2D>(), gameObject.GetComponent<Collider2D>());
}
}

最佳答案

(通常)更好的解决方案是使用图层来管理项目类别之间的冲突。您可以将标记为 obj 的对象分配给特定层,并将帖子中的对象分配给另一层,然后进入 Unity Physics Manager 以禁用这些层之间的碰撞。 Unity Docs 中提供了有关这方面的进一步指导。 .

但如果一定要使用标签,还是有解决办法的。

如果您在碰撞事件中调用 Physics2D.IgnoreCollision,那么您只是在碰撞事件影响速度等后忽略它们的碰撞对象。所以,基本上你说的太晚了。

获得所需行为的更好替代方法是在创建两个对象后运行的方法中调用它。那里的挑战是,您需要一种方法来获取对您想要忽略的其他游戏对象的引用。

一种解决方案是调用对象的 OnEnable() 方法,然后使用 FindGameObjectsWithTag 找到要忽略的其他对象:

public class OneObject : MonoBehaviour {

void OnEnable() {
GameObject[] otherObjects = GameObject.FindGameObjectsWithTag("obj");

foreach (GameObject obj in otherObjects) {
Physics2D.IgnoreCollision(obj.GetComponent<Collider2D>(), GetComponent<Collider2D>());
}

// rest of OnEnable
}
// rest of class ...
}

如果你把它放在两种类型对象的OnEnable中(当然还有另一个对象的标签),它应该能满足你的需要。

关于c# - Unity Physics2D.IgnoreCollision 无法正常运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52657626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com