版本:Unity 6 (6000.0)
语言:English
图层
在 Unity 中创建功能性图层

Unity 中图层的用途

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

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

将摄像机剔除掩码与图层一起使用

如果您使用摄像机一个组件,用于创建场景中特定视点的图像。输出要么绘制到屏幕上,要么捕获为纹理。 更多信息
参见 术语表
剔除掩码允许您根据图层包含或省略要由摄像机渲染的对象。
参见 术语表
,则可以仅渲染特定图层或图层选择中的对象。要更改剔除掩码,请选择要使用的摄像机,然后在检查器一个 Unity 窗口,显示有关当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑值。 更多信息
参见 术语表
窗口中选择“剔除掩码”下拉菜单。如果清除图层的复选框,则它不会在场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您可以放置环境、障碍物和装饰,从本质上讲是分块设计和构建您的游戏。 更多信息
参见 术语表
中渲染。

注意UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表
元素和屏幕空间画布子对象是此规则的例外,无论如何都会渲染。

用图层进行射线投射

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

如果您没有将图层掩码传递给射线投射 API 调用,Unity 将使用Physics.DefaultRaycastLayers,它匹配除“忽略射线投射”之外的所有图层。

Physics.Raycast 函数使用位掩码,每个位决定图层是否被射线忽略。如果图层掩码中的所有位都打开,则射线与所有碰撞器一个用于处理对象物理碰撞的不可见形状。碰撞器不需要与对象的网格完全相同形状 - 粗略的近似值通常更有效,并且在游戏玩法中无法区分。 更多信息
参见 术语表
发生碰撞。如果图层掩码 = 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");
    }
}

注意:如果您没有将图层掩码传递给 Raycast 函数,它仍然会忽略使用“忽略射线投射”图层的碰撞器。

图层
在 Unity 中创建功能性图层