【问题标题】:In Unity 2D, how do I achieve Non-trigger collsion that doesn't "physically" move the rigidbodies?在 Unity 2D 中,如何实现不“物理”移动刚体的非触发碰撞?
【发布时间】:2020-12-15 18:05:32
【问题描述】:

我有一个子弹游戏对象和一个敌方游戏对象。

  • 我想要获得碰撞点/接触点的能力,这就是为什么我认为我需要子弹的对撞机而不是触发对撞机 - 这样,我想让子弹从敌人身上反弹。有时,子弹需要从矩形物体上反弹(不是问题),但我也希望子弹从椭圆物体上反弹(问题)。
  • 我不希望子弹“物理地”推动敌人,这就是为什么直观地我应该将子弹的对撞机设置为触发对撞机。

当子弹的对撞机是触发对撞机时,我似乎没有办法实现弹跳。 但是当碰撞器不是触发碰撞器时,它会推动敌方物体。

没有代码错误,但我认为代码与问题无关。

我怀疑这个问题可能与物理碰撞矩阵有关。

编辑

正如 Leoverload 所建议的那样,光线投射似乎是解决问题的方法。我的问题现在变成了另一个问题,所以我将关闭此线程并打开一个新线程。

感谢@Leoverload 的帮助! :D

【问题讨论】:

    标签: unity3d collision-detection


    【解决方案1】:

    对于命中的位置,这很容易。您必须有 2 个对撞机和 2 个刚体,然后您可以简单地添加一个 Void OnTriggerEnter2D(Collision Coll) 并在其内部检查标签:if(coll.compareTag("surface")) 并在内部您可以通过collision.transform.position 获得位置。 物理菜单上的碰撞矩阵只允许移除某些层之间的碰撞,如果你不希望敌人互相推挤,这很有用!

    如果您不希望玩家被推动,您可以将碰撞器更改为触发,并在碰撞后使用与之前相同的方法使用 void OnTriggerEnter2D 和 compareTag 销毁子弹。这样,它看起来像是碰到了敌人并爆炸了,但实际上它不会碰到任何东西。如果你想给玩家添加击退,那么你可以根据子弹的方向做一个简单的 AddForce,工作就完成了!

    如果你想避免子弹移动墙壁,你可以将墙壁设置为静态,它应该可以正常工作

    【讨论】:

    • 我的问题在于这两行:“添加一个 Void OnTriggerEnter2D(Collision Coll)”和“在里面你可以通过碰撞.transform.position 获得位置”该函数有一个 Collider2D 作为范围。也正因为如此......然后,我只能得到我的子弹碰撞的另一个物体的中心,而我无法得到一个特定的碰撞点。 (这里的“联系人”在图片中)
    • @Blawnode 你可以使用 RaycastHit 命中; if (Physics.Raycast(transform.position, transform.forward, out hit)) 并在其中获取hit.point或位置
    • 我明白了..!!我从未尝试过Raycasting,似乎它可能是解决方案。我将在接下来的 12 小时内尝试该方法,并相应地更新线程。谢谢!
    • 如果您想在 ontriggerenter 中为 RayCast 提供更精确的信息,请参阅answers.unity.com/questions/581977/…@Blawnode
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多