图层
图层 最常用于 摄像机 只渲染场景的一部分,和 光线 只照亮场景的一部分。此外,射线投射也可以用它们选择性地忽略碰撞器或创建 碰撞。
创建图层
第一步是创建一个图层,稍后可以将其分配给一个 游戏对象 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 mask
var 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 mask
var 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 layer
if (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 mask
int 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 layer
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
函数时没有传入 layerMask
,将只会忽略使用了 IgnoreRaycast
图层的碰撞器。这是投射射线时忽略某些碰撞器的最简单方式。