C# 在Unity中使用层和位掩码与光线投射

C# 在Unity中使用层和位掩码与光线投射,c#,unity3d,raycasting,bitmask,C#,Unity3d,Raycasting,Bitmask,Unity的光线投射函数有一个参数,可以用来对特定游戏对象进行光线投射。您还可以使用该参数忽略特定的游戏对象 例如,光线投射功能: public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction

Unity的光线投射函数有一个参数,可以用来对特定游戏对象进行光线投射。您还可以使用该参数忽略特定的游戏对象

例如,光线投射功能:

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。如果您希望光线投射到所有游戏对象,但忽略1,该怎么办

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

4。如果您希望光线投射到所有游戏对象,但忽略2个(多个)游戏对象,该怎么办


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

我看到的大多数
Raycast
问题都错误地使用了
Layermask
。虽然这对他们来说很幸运,但当他们真的想从
Raycast
中排除游戏对象时,通常会遇到问题

这个答案涵盖了人们在执行光线投射时希望使用图层过滤游戏对象的所有场景

1。如何对名为“立方体”的层中的特定游戏对象进行光线投射

首先使用
LayerMask.NameToLayer(“多维数据集”)
将图层名称转换为图层编号。如果层不存在,函数返回
-1
。在执行任何层位操作之前,必须对此进行检查

光线投射到特定层(“仅立方体”):

//将图层名称转换为图层编号
int cubeLayerIndex=LayerMask.NameToLayer(“立方体”);
//检查图层是否有效
如果(立方层索引==-1)
{
LogError(“层不存在”);
}
其他的
{
//计算要光线投射到的layermask。(仅光线投射到“立方体”层)

int layerMask=(1我看到的大多数
Raycast
问题都不正确地使用了
layerMask
。虽然这对他们来说很幸运,但他们通常在实际想从
Raycast
中排除游戏对象时遇到问题

这个答案涵盖了人们在执行光线投射时希望使用图层过滤游戏对象的所有场景

1。如何对名为“立方体”的层中的特定游戏对象进行光线投射

首先使用
LayerMask.NameToLayer(“多维数据集”)
将层名称转换为层编号。如果层不存在,函数将返回
-1
。在执行任何层位操作之前,必须对此进行检查

光线投射到特定层(“仅立方体”):

//将图层名称转换为图层编号
int cubeLayerIndex=LayerMask.NameToLayer(“立方体”);
//检查图层是否有效
如果(立方层索引==-1)
{
LogError(“层不存在”);
}
其他的
{
//计算要光线投射到的layermask。(仅光线投射到“立方体”层)

int layerMask=(1添加到@Programmer的综合答案中

1.如何对“立方体”层中的特定游戏对象进行光线投射

如果您想
Raycast
查看是否只命中特定对象,请调用
object
(…)


对象
可以是
游戏对象
或您的
单一行为
派生脚本(
)。

添加到@Programmer的综合答案中

1.如何对“立方体”层中的特定游戏对象进行光线投射

如果您想
Raycast
查看是否只命中特定对象,请调用
object
(…)


对象
可以是
游戏对象
或您的
单一行为
派生脚本(
).

感谢您将所有有价值的信息放在一个帖子中。我喜欢您的工作,值得投票,但我仍然认为您不应该重复在您之前提出问题的人的问题。我问了这个问题,您被要求专门回答我的问题。然后,您当然可以自己发布此帖子。人们没有enou是时候探究一下帖子的细节了,我也认为你的行为是对的ethics@MohammadFaizanKhan你只问了如何“光线投射到特定的游戏对象”。你的问题已经是许多问题的重复,包括我以前回答过的问题(甚至不包括这一个)。我本可以将其标记为一个,但因为类似的问题(例如排除)被问到并被忽略了,我决定根据所问的问题解释所有可能的使用方法。帖子用线条分隔,以便更容易找到你要找的内容。最后,我的问题不是你的问题的重复。因为你问了如何添加,但我问了如何使用层和位掩码,包括添加将对象复制和删除到层以形成位掩码,并忽略某些层。@程序员,这真是太好了!不过,为了简化事情并避免按位操作,我只需创建一个公共
LayerMask
属性,并使用inspector进行设置。因为在99.9%的情况下,我们不会在运行时决定冲突掩码。感谢您在他把所有有价值的信息都放在一个帖子里。我喜欢你的工作,值得投票,但我仍然认为你不应该重复别人问过你的问题。我问了这个问题,你被要求具体回答我的问题。那么你当然可以自己写这个帖子。人们没有足够的时间去探究细节我也认为你的行为违背了ethics@MohammadFaizanKhan你问过如何“光线投射到特定的游戏对象”,你的问题已经是d了
//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))
    {

    }
}
//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);
//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;
//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;