翻译Unity中文版的初衷是因为官方提供的中文版存在缺陷,而且翻译的不全。现在基于Unity2023.2版本对官方文档进行翻译。
Unity 中的图层用途 🔗
您可以使用图层来优化项目和工作流程。图层的常见用途包括:
- 基于图层的渲染
- 基于图层的碰撞
使用相机剔除遮罩与图层 🔗
如果使用相机的剔除遮罩,您可以只渲染特定图层或选定的图层中的对象。要更改剔除遮罩,请选择要使用的相机,并在Inspector窗口中选择剔除遮罩下拉菜单。如果取消选中图层的复选框,则在场景中不会渲染该图层。
注意:UI元素和屏幕空间画布子对象是例外,并且无论如何都会进行渲染。
使用图层进行射线投射 🔗
您可以使用图层指定射线投射与哪些GameObject相交。要使射线投射忽略一个GameObject,您可以将其分配到“忽略射线投射”图层,或者将LayerMask传递给射线投射的API调用。
如果不将LayerMask传递给射线投射的API调用,Unity将使用Physics.DefaultRaycastLayers,该图层与除“忽略射线投射”以外的每个图层匹配。
Physics.Raycast函数使用位掩码,每个位决定是否忽略该图层的射线。如果在layerMask中的所有位都打开,则射线与所有的碰撞器发生碰撞。如果layerMask = 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");
}
}
注意:如果没有将LayerMask传递给Raycast函数,它仍然会忽略使用IgnoreRaycast图层的碰撞器。
结论 🔗
搬砖愉快!