【问题标题】:Unity RaycastHit2D with something specific具有特定内容的 Unity RaycastHit2D
【发布时间】:2022-07-19 08:36:22
【问题描述】:

我有激光。它永远持续下去。但是,当激光碰到任何东西(如墙壁、玩家、盒子、触发对撞机等)时,它就会停在那里。所以它基本上不会通过对撞机。

但我不想那样。我希望激光仅在 RaycastHit2D 撞到墙上时停止。 有没有办法做到这一点?在此先感谢:D

代码如下:

private LineRenderer lineRenderer;
public Transform LaserHit;
public Transform LaserSpawn;

void Start()
{
    lineRenderer = GetComponent<LineRenderer>();
    lineRenderer.useWorldSpace = true;
}

void Update()
{
    RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.up);
    LaserHit.position = hit.point;
    lineRenderer.SetPosition(0, transform.position);
    lineRenderer.SetPosition(1, LaserHit.position);
}

【问题讨论】:

    标签: c# unity3d collision-detection raycasting


    【解决方案1】:

    :编辑:

    tl;dr - 当您调用 LayerMask.NameToLayer() 或其他任何内容时,您将获得 layer,它会告诉您哪个 bit 对应于您的图层。如果你真的想用那个层ma​​sk,那么你需要通过位移设置那个位。也就是说,如果您只想对墙壁进行光线投射,那么您需要获取墙壁图层:

    int wallsLayer = LayerMask.NameToLayer("Walls");
    

    然后您需要按该数量进行 BIT SHIFT:

    int wallsMask = 1<<wallsLayer;
    

    将它与 raycast 命令一起使用现在只会返回与墙壁的交互。如果你想与除了墙壁之外的所有东西进行交互,那么你需要反转 MASK 而不是 LAYER:

    int everythingButWalls = ~wallsMask;
    

    现在使用它会碰到任何东西除了墙(假设您已经设置了图层 - 请记住,扩展图层选项并添加图层实际上并没有为游戏对象设置图层!)


    通过转到任何游戏对象并在其名称下展开“图层”框然后转到“添加图层”并将其命名为“墙”或其他名称,为墙壁创建一个图层。

    然后转到您的墙壁并将每面墙壁的图层设置为您创建的“墙壁”图层。

    然后在进行光线投射时,使用 Walls 图层作为图层蒙版:

    void Update()
    {
        int wallsLayer = LayerMask.GetMask("Walls");
        int layerMask = 1<<wallsLayer;
        RaycastHit2D hit = Physics2D.Raycast(transform.position, transform.up, Mathf.Infinity, layerMask);
        LaserHit.position = hit.point;
        lineRenderer.SetPosition(0, transform.position);
        lineRenderer.SetPosition(1, LaserHit.position);
    }
    

    【讨论】:

      【解决方案2】:

      简单可控,只需layerMask.value

      public LayerMask laserHitLayer;
      
      public void RayCast()
      {
          var Hit = Physics2D.Raycast(transform.position, transform.up, 2f, laserHitLayer.value);
          
          if (!Hit) return;
          
          // do something when on hit
      }
      

      您可以在检查器中轻松选择和更改所需的图层。

      【讨论】:

        猜你喜欢
        • 2019-12-28
        • 2021-09-21
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        相关资源
        最近更新 更多