如何阻止 NavMeshAgent 与 Animator 分离?

How to stop NavMeshAgent separating from Animator?

我正在进行一个使用 NavMeshAgent 的研究项目。我目前有一个非常简单的场景,其中代理在开始时生成,遍历 "entrance" 触发对撞机,"exit" 触发对撞机,然后最终与 "destroyer" 触发对撞机发生碰撞结束场景的脚本。没有什么复杂的,应该不会发生物理碰撞。

我已经 运行 在编辑器和 -batchmode -nographics 中通过可执行文件进行了一些模拟,该可执行文件会在场景结束时记录基本运行时统计信息。我发现在 Unity 编辑器和 CLI 执行中,场景的执行时间偶尔会出现峰值。我终于发现了正在发生的事情——NavMeshAgent 组件与我的代理分离并漂浮在它前面。

在这张照片中,您可以看到代理上的两个碰撞器(一个非常小,用于物理,一个较大的用于他的"personal space"),出口触发碰撞器(巨大的红色框right,) 悬浮在两者之间的是一个胶囊状的NavMeshAgent组件。

我使用 this unity page 详细说明了如何将 NavMeshAgents 与动画师一起使用,但在重新创建他们推荐的设置后,我仍然遇到问题。

有没有人有任何将 NavMeshAgent 锚定到代理本身的解决方案?

我遇到了完全相同的问题,将 NavMeshAgent 组件设为子组件并在每一帧中设置 NavMeshAgent 的本地位置解决了问题。

private NavMeshAgent agent;

void Awake()
{
    agent = gameObject.GetComponentInChildren<NavMeshAgent>();
    anim = gameObject.GetComponent<Animator> ();
}

private void Update()
{
    agent.transform.localPosition = Vector3.zero;
    // todo:
    // set animator
}
void OnAnimatorMove ()
{
    // Update position to agent position
    transform.position = agent.nextPosition;
}

对于那些在这里跌跌撞撞,但接受的答案对他们不起作用的人。确保 navMeshAgent.updatePosition 设置为 true 或未在脚本中更改。这可能是分开的原因。

NavMeshAgent navMeshAgent;

// This may cause the agent to separate
navMeshAgent.updatePosition = false;


// This will make sure it is synced
navMeshAgent.updatePosition = true;

从 Unity API 的版本 2022.1 开始可以使用。以下是该函数的文档:https://docs.unity3d.com/ScriptReference/AI.NavMeshAgent-updatePosition.html