我与我的导航网格代理挣扎的同时有计算路径无效obvisously没有理由.当问题已经以初始有效路径移动时,问题会不时发生.

在上图中,目的地是左上角的圆锥体.(不要介意NavMeshAgent的方向箭头,我试图用手移动代理,以试图"解锁"他)
检查目的地是否在NavMesh上
public Vector3 GetCharacterPositionOnNavMesh( Vector3 position )
{
NavMeshHit hit;
bool positionFound = NavMesh.SamplePosition( position, out hit, 500, NavMesh.AllAreas );
if ( !positionFound )
Debug.LogWarning( "No valid position found !" );
return positionFound ? hit.position : position;
}
Run Code Online (Sandbox Code Playgroud)检查我的代理的区域掩码,以确保他们可以找到目的地的路径,尽管NavMesh的各个区域
如果代理的路径无效,则几乎检查每个帧.如果是,请使用CalculatePath或计算新的SetDestination.有时,它有效,有时不行.
protected virtual void Update()
{
if ( !Running || !agent.enabled || !agent.isOnNavMesh )
return; …Run Code Online (Sandbox Code Playgroud)我正在尝试创建一个3D点击以在Unity3D中移动游戏.
我添加了一个UI Button(使用UnityEngine.UI),我想最终点击以打开和关闭运行.
然而,点击Button实际上似乎是点击进入场景(在我的情况下UnityEngine.UI.Button导航)并导致我的播放器移动到不同的位置.
如何禁用光线投射以单击UI按钮或以某种方式让UI捕获自己的事件?
我一直在使用典型的Unity3D代码让用户进入游戏玩法等
if (Input.GetMouseButtonDown(0))
{
Run Code Online (Sandbox Code Playgroud)
如果我尝试这种方法也一样
if( Input.touches.Length > 0 )
{
if ( Input.touches[0].phase == TouchPhase.Began )
{
Run Code Online (Sandbox Code Playgroud)
在iOS,Android和桌面上似乎就是这种情况.
这似乎是一个基本问题,点击UI(Button等)似乎落入游戏玩法.
想象一下,弓箭手需要至少距离 3m 才能射中目标,但距离不能超过 10m。所以他必须在这个半径内找到一个有效的位置(当然是在 3d 中)。
因此,我需要的是一种方法,它可以返回导航网格上最近(可到达)的点,并在半径内具有清晰的视线。
我正在考虑始终使用圆边作为计算的起点。因为这应该始终是最近的点。但这在本例中不起作用:
由于圆圈边缘没有直接视线,我不能将其作为起点。
我也在考虑随机选择点(例如 5000 个),检查它们是否具有视线并检查与弓箭手的距离。但这当然是一个可怕的解决方案。
怎样才能找到这个神奇的点呢?
(我不需要脚本,而是一个想法:D)
编辑:
不需要有目标的有效路径。例如,如果一条河流挡住了弓箭手的路径,他将无法找到目标。但他仍然可以射过河。这意味着他可以找到一个有效的位置。

我用google搜索"导航网格上的A*算法"只是为了得到错误的估算g值的方法,就像这样
通过总计蓝线段的长度,我们得到g值,但它被高估了(g值应该被低估).此算法将返回优化路径,但不保证最短路径.
我能想到的唯一方法是根据导航网格绘制可见性图.但这会花费太多内存.
有没有其他方法来计算导航网格中的最短路径?
我期待在我正在开发的游戏中使用 A* 寻路。(我实际上是在为自己制作一个游戏来了解这一点)。我想知道如何将 Unity NavMesh 与自定义 A* 算法一起使用,而不是使用 NavMeshAgent。
考虑以下情况。
NavMesh 内部有一个 AI 代理必须到达的预定义区域。为了方便起见 - 它是圆形区域。
找到该区域的最近点是非常简单的任务。不,我需要找到到达某个区域的最短路径。
在图片示例中,最近的点显然需要代理移动比最佳距离更远的距离。
那么,在这种情况下如何计算所需的目的地点呢?
我必须自己实现波传播算法吗?使用A * 而不是内置的 NavMesh?有没有涉及Unity3D工具的简单解决方案?
注意:所需区域只是由(Vector3)位置和(浮动)半径定义的抽象,而不是游戏场景中的实际对象。
我正在统一制作游戏,它抛出错误“由于没有有效的NavMesh而无法创建代理”,而且我不知道问题出在哪里。
using UnityEngine;
using System.Collections;
public class EnemyMotion : MonoBehaviour {
public NavMeshAgent agent;
public Rigidbody rb;
public GameObject otwt;
void Start () {
rb = GetComponent<Rigidbody>();
agent = GetComponent<NavMeshAgent>();
}
void Update () {
gameObject.transform.Rotate(270, 0, 0);
agent.SetDestination(otwt.transform.position);
}
}
Run Code Online (Sandbox Code Playgroud) 我在编辑器中收到此错误
"SetDestination" can only be called on an active agent that has been placed on a NavMesh.
这些是我在解决问题时尝试的步骤:
我试图在Unity3D飞机上烘焙导航网格,但没有成功。直到最近,在2020.1发布日期左右,我才遇到这个问题。我将平面设置为导航静态、可行走,并在选定平面的情况下烘焙导航网格。NavMesh创建了一个对象。烘焙后“源边界范围”变得非常小。导航网格根本不会出现在屏幕上,通常它应该显示为蓝色。想知道最近是否有其他人遇到过这个问题,或者我可以做些什么来纠正它。
我不希望玩家穿墙。我尝试了 aframe extras,但它在当前的 aframe 版本中不起作用。还有其他适用于 Aframe 1.3.0 的方法或解决方案吗?