Unity3D:图层在 Unity 中的使用

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

图层在 Unity 中的使用

您可以使用图层来优化工程和工作流。图层的常见用途包括: * 基于图层的渲染。 * 基于图层的碰撞。

将相机剔除蒙版与图层一起使用。

如果使用摄像机的剔除蒙版,则只能渲染特定图层或所选图层中的对象。要更改剔除蒙版,请选择要使用的摄像机,然后在“检查器”窗口中选择“剔除蒙版”下拉列表。如果清除图层的复选框,则它不会在场景中渲染。

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

图层的光线投射

您可以使用图层来指定光线投射可以与哪些游戏对象相交。要使光线投射忽略游戏对象,您可以将其分配给忽略光线投射图层,或将图层蒙版传递给光线投射 API 调用。

如果不将 LayerMask 传递给光线投射 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");
    }
}

注:如果不将图层蒙版传递给光线投射函数,它仍会忽略使用 IgnoreRaycast 图层的碰撞体。

此文由3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:覆盖多个级别 (mvrlink.com)

下一篇:Unity3D:在 Unity 中创建功能层 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号