我想在每个障碍物的侧面放置一个物体,玩家可以在那里掩护。为此,我计算了一个效果良好的障碍物的位置,但是当障碍物更大或更小时,此计算将不适用于他们。我需要一种解决所有障碍的方法。
这些图片显示了我的意思:
这也是我的代码:
flex
答案 0 :(得分:0)
问题似乎与如何添加Navmesh代理的半径有关-如果向负值添加某些东西会减小它的半径,这意味着它将在掩护之内。
以下是一些直观示例:
因此,正如我们所看到的,我们实际需要做的取决于目标位置的值是大于还是小于对象的中心,并相应地进行调整以适应它:
代码
为确保其正常运行,以下是我建议您实现的代码:
takeCoverSign.transform.position = (takeCoverSign.transform.position.z + takeCoverSign.transform.position.z / 2) - (takeCoverSign.transform.lossyScale.z + takeCoverSign.transform.lossyScale.z / 2);
if(takeCoverSign.transform.position.z - obstacleList[0].position.z > 0)
{
takeCoverSign.transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z += -navAgent.radius);
}
else
{
takeCoverSign.transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z += navAgent.radius);
}
此外,请注意我如何重命名您的变量。这是camel casing,建议用于变量。
我也删除了不必要的变量分配,除非有理由抽象计算,否则最好使用对变量的引用。
编辑:调整以上答案以创建一个新的Vector3来分配给该位置,而不是尝试直接修改返回值。
答案 1 :(得分:0)
@jared
统一,代码必须如下所示。但是这段代码给了我错误的结果。
注意:我的问题是,此代码不适用于任何障碍物的大小和位置。该代码与我自己的代码完全一样。
Vector3 TempPos = takeCoverSign.transform.position;
TempPos.z = (obstacleList[0].position.z + obstacleList[0].position.z / 2) - (takeCoverSign.lossyScale.z + takeCoverSign.lossyScale.z / 2);
if (TempPos.z - obstacleList[0].position.z > 0)
{
TempPos.z += -navAgent.radius;
}
else
{
TempPos.z += navAgent.radius;
}
takeCoverSign.transform.position = TempPos;