c# - 具有特定内容的 Unity RaycastHit2D

标签 c# unity3d collision-detection raycasting

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

但我不想这样。我希望激光仅在 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);
}

最佳答案

:编辑:

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

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

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

int wallsMask = 1<<wallsLayer;

将其与光线转换命令一起使用现在将仅返回与墙壁的交互。如果你想与除墙壁之外的所有东西交互,那么你需要反转 MASK 而不是 LAYER:

int everythingButWalls = ~wallsMask;

现在使用它可以击中除墙壁外的任何东西(假设您确实设置了图层 - 请记住,扩展图层选项并添加图层实际上并没有为游戏对象设置图层!)


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

enter image description here

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

enter image description here

然后在进行光线转换时,使用 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);
}

关于c# - 具有特定内容的 Unity RaycastHit2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72129035/

相关文章:

c# - FontWeight 属性不起作用 [Windows Phone 8.1 运行时]

collision-detection - 用鼠标控制的 Racket 对快速移动的球进行碰撞检测的问题

c++ - 在 C++ 中检测与数组的冲突

c# - Unity - 检查播放器是否接地不工作

transform - 让 slerp 像 LookAt(x,Vector3.Right) 一样工作

c# - 更改许多相同游戏对象之一的颜色

collision-detection - 快速的射弹并不总是能击中

c# - 使用emgu 3.0,MorphologyEx,C#打开和关闭图像处理

c# - 将 C 代码移植到 C#。指针的问题

c# - 哪个是更好的做法,类的一个客户端实例或每个方法中的一个?