光线投射未按预期运行?

Raycasting not behaving as expected?

在我的 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);
}

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

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

引用 Physics2D.Raycast 的手动条目:

this will also detect Collider(s) at the start of the ray.

你的光线投射从玩家的碰撞器内部开始,所以它会总是命中它。

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

  • 使用图层蒙版忽略玩家的碰撞器
  • 在玩家的碰撞体正下方开始你的光线投射(使用 collider.bounds
  • 使用像 Physics2D.RaycastAll 这样的调用来查找 所有 匹配的碰撞器,然后检查它们是什么

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

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