Version: Unity 6.0 (6000.0)
语言 : 中文
在 Unity 中创建功能层

Unity 中层的用法

您可以使用层来优化项目和工作流程。层的常见用途包括:

  • 基于层的渲染
  • 基于层的碰撞

将摄像机剔除遮罩与层一起使用

如果使用摄像机的剔除遮罩,则只能渲染特定层或选定层中的对象。要更改剔除遮罩,请选择要使用的摄像机,然后在检视面板 (Inspector) 窗口中选择剔除遮罩 (Culling Mask) 下拉选单。如果清除了层的复选框,则不会在场景中渲染。

注意:UI 元素和屏幕空间画布子项是例外,无论如何都会进行渲染。

带层的射线投射

您可以使用层来指定可以与射线投射相交的游戏对象。要使射线投射忽略游戏对象,您可以将其分配给忽略射线投射 (Ignore Raycast) 层,或将 LayerMask 传递给射线投射 API 调用。

如果未将 LayerMask 传递给射线投射 API 调用,Unity 将使用与除忽略射线投射 (Ignore Raycast) 之外的每个层都匹配的 Physics.DefaultRaycastLayers

Physics.Raycast 函数使用位掩码,且每个位决定射线是否忽略某个层。如果 layerMask 中的所有位都启用,则射线将与所有碰撞体发生碰撞。如果 layerMask = 0,则不会发生碰撞。

例如,如果要在第 8 层上投射射线,请参阅下方的代码示例:

int layerMask = 1 << 8;

// Does the ray intersect any objects which are in layer 8?
if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
{
    Debug.Log("The ray hit the player");
}

然后,您可以进行反转,使射线与除第 8 层之外的所有层碰撞。

void Update ()
{
    // Bit shift the index of the layer (8) to get a bit mask
    int layerMask = 1 << 8;

    // This casts rays only against colliders in layer 8.
    // But to collide against everything except layer 8, use the ~ operator because it inverts a bitmask.
    layerMask = ~layerMask;

    RaycastHit hit;
    // Does the ray intersect any objects excluding layer 8.
    if (Physics.Raycast(transform.position, transform.TransformDirection (Vector3.forward), out hit, Mathf.Infinity, layerMask))
    {
        Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
        Debug.Log("Did Hit");
    }
    else
    {
        Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
        Debug.Log("Did not Hit");
    }
}

注意:如果您不将 layerMask 传递到射线投射 (Raycast) 函数,则仍将忽略使用 IgnoreRaycast 层的碰撞体。

在 Unity 中创建功能层