unity 射线过滤

C#

浏览数:111

2019-8-30

AD:资源代下载服务

刚刚看了官方文档,推荐layers来做
我直接翻译了一下官方文档
这个是官方文档链接 https://docs.unity3d.com/Manual/Layers.html

第一步是创建一个新层,然后我们可以分配给一个
GameObject要创建新图层,请打开“编辑”菜单,然后选择“

项目设置 – >标签和图层
我们在一个空的用户图层中创建一个新图层。
我们选择第8层。


分配图层

现在您已经创建了一个新的图层,您必须将图层分配给其中一个游戏对象。

Layer-ChooseLayer.png

在标签管理器中,我们将Player层分配到第8层。

仅使用相机的剔除面具绘制场景的一部分

使用相机的剔除面罩,您可以选择性地渲染位于一个特定图层中的对象。
为此,请选择应选择性渲染对象的相机。

通过勾选或取消勾选剔除掩码属性中的图层来修改剔除掩码。

Layer-CullingMask.png

铸造射线选择性

使用图层可以投射光线并忽略特定图层中的对角线。
例如,您可能想要仅对播放器层投射光线,并忽略所有其他对撞机。

Physics.Raycast函数采用位掩码,其中每个位决定层是否被忽略。
如果layerMask中的所有位都处于打开状态,我们将与所有的碰撞器相冲突。
如果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");

在现实世界中,你要做的是与之相反的。
我们要对所有的碰撞器投射射线,除了在球员层中。

// 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");
}
}

当您没有将LayerMask传递给Raycast功能时,它只会忽略使用IgnoreRaycast图层的对齐机。
这是在投射光线时忽略某些对照物的最简单方法。

************点击这里可以看到作者的其他文章********************欢迎转载,转载请标明出处: http://www.jianshu.com/p/a086d2fa2e99 ********

作者:齊葩