首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果当前目标无法到达,则在NavMesh上查找最近的点

如果当前目标无法到达,则在NavMesh上查找最近的点
EN

Game Development用户
提问于 2015-02-11 16:09:17
回答 3查看 14K关注 0票数 1

我有一个模拟环境,设置了一个多维数据集,该多维数据集有一个指定的“不可步行”层。我使用NavMeshAgent和NavMeshPath来设置播放器的目的地。我设置路径的方式是通过点击鼠标在地形上的光线投射点。

如果我点击具有“不可步行”层的多维数据集,玩家就会跑到立方体并试图达到这个点,我很难找到修复的方法。

我读过关于FindClosestEdge函数的统一的文章,但我不认为这正是我想要的。

因此,基本上,当我单击多维数据集时,我需要目标位置更改到多维数据集旁边的最近点。

有什么想法吗?

EN

回答 3

Game Development用户

发布于 2015-02-20 02:06:58

我也在想这件事!遗憾的是,没有任何答复。

我做了一些类似的事情--不包括在肚脐网中行走的部分,比如场景中的静态物体,当我的代理人到达它们并继续行走的时候,这将是一个问题。然后走路。也许这对你有用。

现在,我做了一些事情,让我的经纪人尽可能地靠近一个不在肚脐上的区域,然后停下来,我清理了这条路。

我将这些内容放入更新中的if语句中,并检查是否已到达目的地。检查路径的类型是否是部分的(我认为:它的一部分是不可到达的),然后如果我们有一条通向所需位置的路径(如果我们还能做更多的运动,那么当我们到达块时是假的)。

代码语言:javascript
运行
复制
agent.pathStatus == NavMeshPathStatus.PathPartial && !agent.hasPath

这样的话,即使我点击一些不可步行的东西,比如在一个街区内,它也会走得尽可能近并停下来。那我就让它弃道而去。

这是我在用的东西,直到我找到更好的东西。它检查代理是否已到达目的地。在这个块中还有我的代码,可以查看代理是否已经到达目的地,而路径不是部分的,这样我就可以控制行走和空闲的动画了。isMoving是在为代理设置目标时设置的。好像是一口。与部分路径相关的内容在上面,如果您感兴趣的话,您可以在下面使用它。

代码语言:javascript
运行
复制
   if (isMoving && !agent.pathPending)
    {
        if ((agent.pathStatus == NavMeshPathStatus.PathPartial && !agent.hasPath) ||
            ((Vector3.Distance(agent.destination, agent.transform.position) <= agent.stoppingDistance) &&
             (!agent.hasPath || agent.velocity.sqrMagnitude == 0f)))
        {
            Debug.Log("reached destination");
            isMoving = false;
            anim.SetBool("IsRunning", isMoving);

            agent.ResetPath(); 
        }

    }

我对团结还是陌生的,所以我不确定这是否是最理想的方法。如果有人有意见,我会很高兴听到的!

编辑:我在胡闹(有些东西闻起来了.)我觉得有些代码是多余的。我在与其他代码相同的条件下对它进行了测试,得到了与其他代码相同的结果:

代码语言:javascript
运行
复制
   if (isMoving && !agent.pathPending && !agent.hasPath)
    {
        Debug.Log("reached destination");
        isMoving = false;

        anim.SetBool("IsRunning", isMoving);
        agent.ResetPath(); 
    }
票数 1
EN

Game Development用户

发布于 2015-03-22 00:29:02

我正在处理一个类似的问题,虽然我还没有测试它,但我认为您可以从用户的位置开始使用NavMesh.Raycast,并将多维数据集放置在射线击中位置的任何位置。希望这能有所帮助。

票数 0
EN

Game Development用户

发布于 2021-04-10 19:30:03

您只需预先计算路径,例如:

然后if (Input.GetMouseButtonDown(0)) { navAgent.CalculatePath(point,navAgent.path); /*bool*/ pathComplete = false; }就会发现你问的是什么

代码语言:javascript
运行
复制
if(pathComplete == false) {
if(navAgent.path.status == NavMeshPathStatus.PathComplete || 
navAgent.hasPath && navAgent.path.status == NavMeshPathStatus.PathPartial) {

navAgent.SetDestination(point);
pathComplete = true;
   }
}

navAgent.destination将是可步行区域上距离目的地最近的点!

问题是,当您不预先计算路径并多次设置您的navAgent的目标每秒,目标将始终是确切的点,您的目的地设置为!因此,在预先计算路径和navAgent.SetDestination(point);之后,您的NavAgent最接近的可达点将是navAgent.destination!就这样。

票数 0
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/93886

复制
相关文章

相似问题

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