根据Unity3d中的障碍物设置对象

时间:2018-09-11 22:14:06

标签: unity3d

我想在每个障碍物的侧面放置一个物体,玩家可以在那里掩护。为此,我计算了一个效果良好的障碍物的位置,但是当障碍物更大或更小时,此计算将不适用于他们。我需要一种解决所有障碍的方法。

这些图片显示了我的意思:

Image 1 - Correct Position

Image 2 - Incorrect Position

这也是我的代码:

flex

2 个答案:

答案 0 :(得分:0)

问题似乎与如何添加Navmesh代理的半径有关-如果向负值添加某些东西会减小它的半径,这意味着它将在掩护之内。

以下是一些直观示例:

Left of cover, plus agent.radius Right of cover, plus agent radius

因此,正如我们所看到的,我们实际需要做的取决于目标位置的值是大于还是小于对象的中心,并相应地进行调整以适应它:

Left and right of cover, with correct radius calculation

代码

为确保其正常运行,以下是我建议您实现的代码:

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;