- 图层
- 创建图层
- 分配图层
- 使用摄像机的剔除遮罩仅绘制部分场景
- 选择性地投射射线
图层
图层 最常用于 摄像机 只渲染场景的一部分,和 光线 只照亮场景的一部分。此外,射线投射也可以用它们选择性地忽略碰撞器或创建 碰撞。
创建图层
第一步是创建一个图层,稍后可以将其分配给一个 游戏对象 GameObject。要创建图层,请打开菜单并选择 Project Settings->Tags and Layers。
我们在空着的 User Layers 中新建一个图层。选择第 8 图层 User Player 8。

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

在标签管理器中,指定图层 Layer 为 Player。
使用摄像机的剔除遮罩仅绘制部分场景
使用摄像机的剔除遮罩,你可以选择性地渲染特定图层中的对象。为此,请选中负责选择性渲染对象的摄像机。
在剔除遮罩 culling mask 属性中,通过选中或取消图层来修改。

选择性地投射射线
通过使用图层,你可以在投射射线时选择性地忽略特定图层中的碰撞器。例如,你可能想要投射只针对玩家的射线,而忽略所有其他碰撞器。
函数 Physics.Raycast 接受一个位掩码 layerMask,其中每一个比特决定了一个图形是否将被忽略。如果 layerMask 中的所有比特位都为 1,那么该射线将和所有碰撞器发生碰撞。如果 layerMask 等于 0,那么该射线永远不会和任意对象发生碰撞。
// JavaScript example.// bit shift the index of the layer to get a bit maskvar layerMask = 1 << 8;// Does the ray intersect any objects which are in the player layer.if (Physics.Raycast (transform.position, Vector3.forward, Mathf.Infinity, layerMask))print ("The ray hit the player");
// C# example.int layerMask = 1 << 8;// Does the ray intersect any objects which are in the player layer.if (Physics.Raycast(transform.position, Vector3.forward, Mathf.Infinity, layerMask))Debug.Log("The ray hit the player");
而在现实世界中,你想要做的恰好与之相反。我们想要向所有碰撞器投射射线,除了 Player 图层中的碰撞器。
// JavaScript example.function Update () {// Bit shift the index of the layer (8) to get a bit maskvar layerMask = 1 << 8;// This would cast rays only against colliders in layer 8.// But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.layerMask = ~layerMask;var hit : RaycastHit;// Does the ray intersect any objects excluding the player layerif (Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), hit, Mathf.Infinity, layerMask)) {Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) * hit.distance, Color.yellow);print ("Did Hit");} else {Debug.DrawRay (transform.position, transform.TransformDirection (Vector3.forward) *1000, Color.white);print ("Did not Hit");}}
// C# example.void Update () {// Bit shift the index of the layer (8) to get a bit maskint layerMask = 1 << 8;// This would cast rays only against colliders in layer 8.// But instead we want to collide against everything except layer 8. The ~ operator does this, it inverts a bitmask.layerMask = ~layerMask;RaycastHit hit;// Does the ray intersect any objects excluding the player layerif (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 函数时没有传入 layerMask,将只会忽略使用了 IgnoreRaycast 图层的碰撞器。这是投射射线时忽略某些碰撞器的最简单方式。
