DoN*_*Box 3 c# collision unity-game-engine
我试图让两个对象互相忽略。我尝试实现Physics2D.IgnoreCollision代码,但就目前情况而言,第一个物体从天上掉下来,要么A)直接击中下面的物体,停留一秒钟,然后继续沿着屏幕向下移动,要么B)如果从侧面撞击下面的物体,它只会瞥一眼。我希望两个人彻底无视对方。
这是我的代码:
void OnCollisionEnter2D(Collision2D collision) {
if (collision.gameObject.tag == "obj") {
Physics2D.IgnoreCollision(collision.gameObject.GetComponent<Collider2D>(), gameObject.GetComponent<Collider2D>());
}
}
Run Code Online (Sandbox Code Playgroud)
一个(通常)更好的解决方案是使用层来管理项目类别之间的冲突。您可以将obj
- 标记的对象分配给特定层,并将帖子中的对象分配给另一层,然后进入 Unity 物理管理器以禁用这些层之间的碰撞。Unity 文档中提供了进一步的指导。
但如果必须使用标签,还是有解决办法的。
如果您在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 ...
}
Run Code Online (Sandbox Code Playgroud)
如果您将其放入OnEnable
两种类型的对象中(当然还有另一个对象的标签),它应该满足您的需求。
归档时间: |
|
查看次数: |
6731 次 |
最近记录: |