gpt4 book ai didi

c# - 在 Unity 中将图层和位掩码与光线转换一起使用

转载 作者:太空狗 更新时间:2023-10-29 23:58:00 24 4
gpt4 key购买 nike

Unity 的 Raycast 函数有一个参数,您可以使用该参数将光线转换到特定的游戏对象。您还可以使用该参数来忽略特定的游戏对象。

例如 Raycast 函数:

public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

layerMask 参数用于指定哪些对象应该/不应该接收光线转换。


1。如何将光线转换到位于称为“立方体”的层中的特定游戏对象?

2。如果场景中有 10 个游戏对象,但您只想对 2 个游戏对象进行光线转换,而忽略其余部分怎么办?你是怎么做到的?

假设那些对象的图层是“立方体”和“球体”。

3。如果您想对所有 GameObjects 进行光线转换但忽略 1,该怎么办。

假设要忽略的游戏对象位于“立方体”层中。

4。如果您想对所有 游戏对象进行光线转换但忽略 2(多个)游戏对象怎么办。

同样,要忽略的图层是“立方体”和“球体”图层。

最佳答案

大多数Raycast我看到的问题使用 Layermask不正确。虽然这对他们来说是幸运的,但当他们真正想从 Raycast 中排除一个游戏对象时,他们通常会遇到问题。 .

这个答案是为了涵盖人们在执行光线转换时想要使用图层来过滤游戏对象的所有场景。

1.How do you raycast to a particular GameObject which is in a layer called "cube"?

首先你使用LayerMask.NameToLayer("cube")将图层名称转换为图层编号。 LayerMask.NameToLayer 函数返回 -1如果图层不存在。在进行任何图层按位操作之前,您必须检查此项。

光线转换到特定层(仅限“立方体”):

//Convert Layer Name to Layer Number
int cubeLayerIndex = LayerMask.NameToLayer("cube");

//Check if layer is valid
if (cubeLayerIndex == -1)
{
Debug.LogError("Layer Does not exist");
}
else
{
//Calculate layermask to Raycast to. (Raycast to "cube" layer only)
int layerMask = (1 << cubeLayerIndex);

Vector3 fwd = transform.TransformDirection(Vector3.forward);

//Raycast with that layer mask
if (Physics.Raycast(transform.position, fwd, 10, layerMask))
{

}
}

上面例子中最重要的部分是int layerMask = (1 << cubeLayerIndex); .

为了使这个答案简短,我不会检查其余答案的错误。


2.What if you have 10 GameObjects in the scene but you only want to raycast to just 2 GameObjects and ignore the rest? How do you do that?

Let's say that those Object's layers are "cube" and "sphere".

光线转换到“立方体”和“球体”层并忽略其余部分:

//Convert Layer Name to Layer Number
int cubeLayerIndex = LayerMask.NameToLayer("cube");
int sphereLayerIndex = LayerMask.NameToLayer("sphere");

//Calculate layermask to Raycast to. (Raycast to "cube" && "sphere" layers only)
int layerMask = (1 << cubeLayerIndex) | (1 << sphereLayerIndex);

3.What if you want to raycast to all GameObjects but ignore 1.

Let's say that the GameObject to ignore is in the "cube" layer.

光线转换到所有但忽略“立方体”层:

//Convert Layer Name to Layer Number
int cubeLayerIndex = LayerMask.NameToLayer("cube");

//Calculate layermask to Raycast to. (Ignore "cube" layer)
int layerMask = (1 << cubeLayerIndex);
//Invert to ignore it
layerMask = ~layerMask;

4.What if you want to raycast to all GameObjects but ignore 2(multiple) GameObjects.

Again, the layers to ignore are the "cube" and "sphere" layers.

光线转换到所有但忽略“立方体”和“球体”层:

//Convert Layer Name to Layer Number
int cubeLayerIndex = LayerMask.NameToLayer("cube");
int sphereLayerIndex = LayerMask.NameToLayer("sphere");

//Calculate layermask to Raycast to. (Ignore "cube" && "sphere" layers)
int layerMask = ~((1 << cubeLayerIndex) | (1 << sphereLayerIndex));

//Convert Layer Name to Layer Number
int cubeLayerIndex = LayerMask.NameToLayer("cube");
int sphereLayerIndex = LayerMask.NameToLayer("sphere");

//Calculate layermask to Raycast to. (Ignore "cube" && "sphere" layers)
int layerMask = (1 << cubeLayerIndex);
layerMask |= (1 << sphereLayerIndex);
layerMask |= (1 << otherLayerToIgnore1);
layerMask |= (1 << otherLayerToIgnore2);
layerMask |= (1 << otherLayerToIgnore3);
//Invert to ignore it
layerMask = ~layerMask;

最后,如果您知道图层索引/编号,则无需使用 LayerMask.NameToLayer功能。只需在此处插入该图层索引即可。例如,让我们将光线转换到索引 #9 中的“立方体”层。你可以做 int layerMask = (1 << 9); .

参见 Layers手册以阅读有关此主题的更多信息。

关于c# - 在 Unity 中将图层和位掩码与光线转换一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43559722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com