Version: 6000.3
语言: 中文
在 Unity 中创建功能层

Unity 中图层的用途

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

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

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

如果使用相机在场景中创建特定视点图像的组件。输出要么绘制到屏幕上,要么作为纹理捕获。更多信息
请参阅术语表
剔除遮罩允许你包括或省略要由摄像机渲染的对象,按图层。
请参阅术语表
.要更改剔除遮罩,请选择要使用的摄像机,然后在检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
请参阅术语表
窗。如果清除图层的复选框,则该图层不会在场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表
.

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

带图层的光线投射

您可以使用层来指定光线投射可以与哪些游戏对象相交。要使光线投射忽略游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
请参阅术语表
,您可以将其分配给 Ignore Raycast 图层,或将 LayerMask 传递给光线投射 API 调用。

如果您没有将 LayerMask 传递给光线投射 API 调用,Unity 会使用 Physics.DefaultRaycastLayers,该层与除 Ignore Raycast 之外的所有层匹配。

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 中创建功能层