首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Unity3d中根据障碍物设置对象

在Unity3d中根据障碍物设置对象
EN

Stack Overflow用户
提问于 2018-09-12 06:14:06
回答 2查看 68关注 0票数 1

我想在每个玩家可以遮挡的障碍物旁边放置一个物体。为了做到这一点,我计算了其中一个障碍物的位置,但当障碍物较大或较小时,此计算不适用于它们。我需要一种为所有障碍做这件事的方法。

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

Image 1 - Correct Position

Image 2 - Incorrect Position

下面是我的代码:

代码语言:javascript
复制
        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;
EN

回答 2

Stack Overflow用户

发布于 2018-09-12 10:35:22

看起来问题出现在如何添加Navmesh代理的半径上-如果您将某些内容添加到负值,这将减少它,这意味着它将在覆盖范围内。

这里有一些可视化的例子:

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

代码

因此,为了确保它正常工作,下面是我建议您实现的代码:

代码语言:javascript
复制
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分配给该位置,而不是尝试直接修改返回值。

票数 0
EN

Stack Overflow用户

发布于 2018-09-12 17:05:02

@jared

总而言之,代码必须像下面这样写。但是这段代码给了我错误的结果。

注释:我的问题是,此代码不适用于任何障碍物大小和位置。这段代码的工作方式与我自己的代码完全一样。

代码语言:javascript
复制
    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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52284871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档