【问题标题】:Raycasting not behaving as expected?光线投射的行为不符合预期?
【发布时间】:2015-05-26 22:24:24
【问题描述】:

在我的 2d 游戏中,世界是按方块排列的(就像 2d minecraft 一样),我试图让玩家在按下地雷按钮时打破他下方的方块。这是我的代码:

if(Input.GetButtonDown("MineDown"))
{

    Transform other = Physics2D.Raycast(new Vector2(gameObject.transform.position.x, gameObject.transform.position.y), new Vector2(Vector3.down.x, Vector3.down.y), Mathf.Infinity).transform;
    Destroy(other.gameObject);
}

唯一的问题是当我按下地雷按钮时,玩家会被摧毁,而不是它下面的方块。这不是我预期的行为,但我不知道如何解决。

【问题讨论】:

  • 这很奇怪。我已经使用 Unity3d 一段时间了。您是否尝试过使用 Debug.DrawLine 来查看 Raycast 的开始位置和结束位置?您可以尝试直接在他们的论坛中提问,那里肯定会有更好的答案。
  • 我使用了 Debug.DrawRay,我得到了我所期望的,一条从我的播放器中心直接到地面的线。我也在 Unity3D.com 的论坛上发布了这个问题。

标签: unity3d game-physics raycasting


【解决方案1】:

了解您正在使用的物理引擎非常重要。如果光线投射在碰撞器内开始,一些光线投射系统会忽略碰撞器,而有些则不会。

引用 Physics2D.Raycast 的手动条目:

这也将在光线开始处检测碰撞器。

您的光线投射在玩家的对撞机内部开始,所以它会总是击中它。

可能的解决方法,大致按照我建议尝试的顺序:

  • 使用图层蒙版以忽略玩家的对撞机
  • 在玩家对撞机下方开始您的光线投射(使用 collider.bounds
  • 使用类似Physics2D.RaycastAll 的调用来查找所有个匹配的碰撞器,然后检查它们是什么

图层蒙版很容易设置。您需要使用标签和图层面板注册一个新图层,然后使用检查器窗口将该图层应用于场景中的对象。当您在不同图层上有对象时,您可以使用它们来控制渲染、碰撞、光线投射等。

我经常为玩家、敌人、地形等设置图层。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多