我有激光。它永远持续下去。但是当激光接触到任何东西(墙壁、播放器、盒子、触发碰撞器等)时,它就会停在那里。所以它基本上不会经过对撞机。
但我不想这样。我希望激光仅在 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;
现在使用它可以击中除墙壁外的任何东西(假设您确实设置了图层 - 请记住,扩展图层选项并添加图层实际上并没有为游戏对象设置图层!)
通过转到任何游戏对象并在其名称下展开“层”框,然后转到“添加层”并将其命名为“墙”或其他名称,为墙创建一个层。
然后转到您的墙壁并将每个墙壁的图层设置为您创建的“墙壁”图层。
然后在进行光线转换时,使用 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/