c# - Unity Physics2D.IgnoreCollision 无法正常运行
问题描述
我试图让两个对象互相忽略。我尝试实现 Physics2D.IgnoreCollision 代码,但就目前而言,第一个物体从天上掉下来,或者 A)直接撞击下面的物体,在那里停留一秒钟,然后继续向下移动屏幕,或者 B)如果它从侧面撞击它,它只会瞥一眼下面的物体。我希望两者完全互相忽略。
这是我的代码:
void OnCollisionEnter2D(Collision2D collision) {
if (collision.gameObject.tag == "obj") {
Physics2D.IgnoreCollision(collision.gameObject.GetComponent<Collider2D>(), gameObject.GetComponent<Collider2D>());
}
}
解决方案
一个(通常)更好的解决方案是使用层来管理项目类别之间的冲突。您可以将obj
-tagged 对象分配给特定层,并将帖子中的对象分配给另一个层,然后进入 Unity 物理管理器以禁用这些层之间的碰撞。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
两种类型的对象中(当然还有另一个对象的标签),它应该满足你的需要。
推荐阅读
- reactjs - Redux - 传播不可迭代实例的无效尝试
- android - 当用户点击地图时,如何更改 MapBox 符号的位置?
- c# - 回退处理程序无法加载库 libc.dll
- c# - 用 1 个附加属性包装对象列表
- fullcalendar - 如何在“fullcalendar”标题部分添加图像?
- jquery - 字符串前两个字符的正则表达式应该是 GE | TE | 西宁 | 助教 | 用户 | BW 和 Next 两个字符应该是 RU |MT | LD
- java - CSV 文件在使用追加功能时不会添加文本
- nosql - 无法在 hbase shell 中创建对象
- vue.js - 有没有办法修复我的两种方式绑定和使用道具传递数据。他们没有被认可
- c++ - 使用未来的wait_for时无法检查成员变量,但如果我在线程中睡眠,它可以工作