• 图层
    • 创建图层
    • 分配图层
    • 使用摄像机的剔除遮罩仅绘制部分场景
    • 选择性地投射射线

    图层

    图层 最常用于 摄像机 只渲染场景的一部分,和 光线 只照亮场景的一部分。此外,射线投射也可以用它们选择性地忽略碰撞器或创建 碰撞。

    创建图层

    第一步是创建一个图层,稍后可以将其分配给一个 游戏对象 GameObject。要创建图层,请打开菜单并选择 Project Settings->Tags and Layers

    我们在空着的 User Layers 中新建一个图层。选择第 8 图层 User Player 8

    图层 - 图1

    分配图层

    现在,你已经新建了一个图层,必须将该图层分配给一个游戏对象。

    图层 - 图2

    在标签管理器中,指定图层 Layer 为 Player。

    使用摄像机的剔除遮罩仅绘制部分场景

    使用摄像机的剔除遮罩,你可以选择性地渲染特定图层中的对象。为此,请选中负责选择性渲染对象的摄像机。

    在剔除遮罩 culling mask 属性中,通过选中或取消图层来修改。

    图层 - 图3

    选择性地投射射线

    通过使用图层,你可以在投射射线时选择性地忽略特定图层中的碰撞器。例如,你可能想要投射只针对玩家的射线,而忽略所有其他碰撞器。

    函数 Physics.Raycast 接受一个位掩码 layerMask,其中每一个比特决定了一个图形是否将被忽略。如果 layerMask 中的所有比特位都为 1,那么该射线将和所有碰撞器发生碰撞。如果 layerMask 等于 0,那么该射线永远不会和任意对象发生碰撞。

    1. // JavaScript example.
    2. // bit shift the index of the layer to get a bit mask
    3. var layerMask = 1 << 8;
    4. // Does the ray intersect any objects which are in the player layer.
    5. if (Physics.Raycast (transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    6. print ("The ray hit the player");
    1. // C# example.
    2. int layerMask = 1 << 8;
    3. // Does the ray intersect any objects which are in the player layer.
    4. if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))
    5. Debug.Log("The ray hit the player");

    而在现实世界中,你想要做的恰好与之相反。我们想要向所有碰撞器投射射线,除了 Player 图层中的碰撞器。

    1. // JavaScript example.
    2. function Update () {
    3. // Bit shift the index of the layer (8) to get a bit mask
    4. var layerMask = 1 << 8;
    5. // This would cast rays only against colliders in layer 8.
    6. // But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
    7. layerMask = ~layerMask;
    8. var hit : RaycastHit;
    9. // Does the ray intersect any objects excluding the player layer
    10. if (Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask)) {
    11. Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
    12. print ("Did Hit");
    13. } else {
    14. Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
    15. print ("Did not Hit");
    16. }
    17. }
    1. // C# example.
    2. void Update () {
    3. // Bit shift the index of the layer (8) to get a bit mask
    4. int layerMask = 1 << 8;
    5. // This would cast rays only against colliders in layer 8.
    6. // But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.
    7. layerMask = ~layerMask;
    8. RaycastHit hit;
    9. // Does the ray intersect any objects excluding the player layer
    10. if (Physics.Raycast(transform.position, transform.TransformDirection (Vector3.forward), out hit, Mathf.Infinity, layerMask)) {
    11. Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);
    12. Debug.Log("Did Hit");
    13. } else {
    14. Debug.DrawRay(transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);
    15. Debug.Log("Did not Hit");
    16. }
    17. }

    如果调用 Raycast 函数时没有传入 layerMask,将只会忽略使用了 IgnoreRaycast 图层的碰撞器。这是投射射线时忽略某些碰撞器的最简单方式。