gpt4 book ai didi

c# - 检查 Raycast 是否命中,是否命中来自 LayerMask 的图层?

转载 作者:太空宇宙 更新时间:2023-11-03 20:53:14 24 4
gpt4 key购买 nike

标题说明了一切。

最初我使用的是:

hit.transform.gameObject.layer == LayerMask.NameToLayer("Floor")

但最终我发现我需要为不同的楼层使用不同的层,我想我应该使用 LayerMask,如果我错了但不能让它工作,请纠正我。

在文档的顶部我有:

public LayerMask floorLayers;

在无效更新中我有:

int floorMask = ~floorLayers.value;

在 if 语句中我有:

if (playerHasWetFeet == true && wetSteps < maxWetSteps && controller.isGrounded && hit.transform.gameObject.layer == floorMask)

然而,这不起作用。

谁能指出我做错了什么?

编辑:

这是我的更新功能:

int floorMask = ~floorLayers.value;

currentFrameFootstepLeft = anim.GetFloat("FootstepLeft");

if (currentFrameFootstepLeft > 0 && lastFrameFootstepLeft < 0)
{
if (Physics.Raycast(transform.position, dirDown, out hit, 10f, floorMask))
{
if (playerHasWetFeet == true && wetSteps < maxWetSteps && controller.isGrounded && (1 << hit.transform.gameObject.layer & floorMask) != 0)
{
LeftWetStepSpawner();
Debug.Log("Hit");
}

最佳答案

有了这个:

if(hit.transform.gameObject.layer == floorMask)

您只是比较 RaycastHit 结果中的层命中。如果这确实是您想要的,并且您只想检查光线转换到图层上的内容,那么不要在图层上执行任何位掩码操作。

删除这个:

int floorMask = ~floorLayers.value;

获取图层索引:

int floor1 = LayerMask.NameToLayer("Floor1");
int floor2 = LayerMask.NameToLayer("Floor2");
int floor3 = LayerMask.NameToLayer("Floor2");

然后直接比较Layer index就可以了:

if (hit.transform.gameObject.layer == floor1)
{

}

if (hit.transform.gameObject.layer == floor2)
{

}

if (hit.transform.gameObject.layer == floor3)
{

}

虽然这应该可以解决您的问题,但使用图层蒙版的主要原因是过滤光线转换。使用图层蒙版时,您可以使用它来决定光线转换应该命中或忽略哪些对象,如果这是您实际想要做的,不要像您在代码中那样比较图层。只需找到 mask ,然后将 mask 传递给光线转换函数即可。我不确定这是否是您想要做的,但是这两个示例应该让您了解图层蒙版的用途。

例如,您只想对“Floor”层上的对象进行光线转换,而不希望光线转换到另一层上的任何其他对象:

int floorLayerIndex = LayerMask.NameToLayer("Floor");

//Check if layer is valid
if (floorLayerIndex == -1)
{
Debug.LogError("Layer Does not exist");
}
else
{
//Calculate layermask to Raycast to. (Raycast to "Floor" layer only)
int layerMask = (1 << floorLayerIndex);

Vector3 fwd = transform.TransformDirection(Vector3.forward);
RaycastHit hit;

//Raycast with that layer mask
if (Physics.Raycast(transform.position, fwd, out hit, 10, layerMask))
{

}
}

您可以在 this 上找到许多其他示例发布。

关于c# - 检查 Raycast 是否命中,是否命中来自 LayerMask 的图层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53193139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com