我想在每个玩家可以遮挡的障碍物旁边放置一个物体。为了做到这一点,我计算了其中一个障碍物的位置,但当障碍物较大或较小时,此计算不适用于它们。我需要一种为所有障碍做这件事的方法。
这些图片显示了我的意思:
下面是我的代码:
Vector3 ObjectPos = TakeCoverSign.transform.position;
Vector3 ObjectSize = TakeCoverSign.transform.lossyScale;
Vector3 ObstaclePos = ObstacleList[0].position;
ObjectPos.z = (ObstaclePos.z + ObstaclePos.z / 2) - (ObjectSize.z + ObjectSize.z / 2) + navAgent.radius;
TakeCoverSign.transform.position = ObjectPos;发布于 2018-09-12 10:35:22
看起来问题出现在如何添加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分配给该位置,而不是尝试直接修改返回值。
发布于 2018-09-12 17:05:02
@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;https://stackoverflow.com/questions/52284871
复制相似问题