我有一个模拟环境,设置了一个多维数据集,该多维数据集有一个指定的“不可步行”层。我使用NavMeshAgent和NavMeshPath来设置播放器的目的地。我设置路径的方式是通过点击鼠标在地形上的光线投射点。
如果我点击具有“不可步行”层的多维数据集,玩家就会跑到立方体并试图达到这个点,我很难找到修复的方法。
我读过关于FindClosestEdge函数的统一的文章,但我不认为这正是我想要的。
因此,基本上,当我单击多维数据集时,我需要目标位置更改到多维数据集旁边的最近点。
有什么想法吗?
发布于 2015-02-20 02:06:58
我也在想这件事!遗憾的是,没有任何答复。
我做了一些类似的事情--不包括在肚脐网中行走的部分,比如场景中的静态物体,当我的代理人到达它们并继续行走的时候,这将是一个问题。然后走路。也许这对你有用。
现在,我做了一些事情,让我的经纪人尽可能地靠近一个不在肚脐上的区域,然后停下来,我清理了这条路。
我将这些内容放入更新中的if语句中,并检查是否已到达目的地。检查路径的类型是否是部分的(我认为:它的一部分是不可到达的),然后如果我们有一条通向所需位置的路径(如果我们还能做更多的运动,那么当我们到达块时是假的)。
agent.pathStatus == NavMeshPathStatus.PathPartial && !agent.hasPath
这样的话,即使我点击一些不可步行的东西,比如在一个街区内,它也会走得尽可能近并停下来。那我就让它弃道而去。
这是我在用的东西,直到我找到更好的东西。它检查代理是否已到达目的地。在这个块中还有我的代码,可以查看代理是否已经到达目的地,而路径不是部分的,这样我就可以控制行走和空闲的动画了。isMoving是在为代理设置目标时设置的。好像是一口。与部分路径相关的内容在上面,如果您感兴趣的话,您可以在下面使用它。
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();
}
}
我对团结还是陌生的,所以我不确定这是否是最理想的方法。如果有人有意见,我会很高兴听到的!
编辑:我在胡闹(有些东西闻起来了.)我觉得有些代码是多余的。我在与其他代码相同的条件下对它进行了测试,得到了与其他代码相同的结果:
if (isMoving && !agent.pathPending && !agent.hasPath)
{
Debug.Log("reached destination");
isMoving = false;
anim.SetBool("IsRunning", isMoving);
agent.ResetPath();
}
发布于 2015-03-22 00:29:02
我正在处理一个类似的问题,虽然我还没有测试它,但我认为您可以从用户的位置开始使用NavMesh.Raycast,并将多维数据集放置在射线击中位置的任何位置。希望这能有所帮助。
发布于 2021-04-10 19:30:03
您只需预先计算路径,例如:
然后if (Input.GetMouseButtonDown(0)) { navAgent.CalculatePath(point,navAgent.path); /*bool*/ pathComplete = false; }
就会发现你问的是什么
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
!就这样。
https://gamedev.stackexchange.com/questions/93886
复制相似问题