图层

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

创建图层

第一步是创建一个图层,稍后可以将其分配给一个 游戏对象 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 图层的碰撞器。这是投射射线时忽略某些碰撞器的最简单方式。