【问题标题】:How to stop NavMeshAgent separating from Animator?如何阻止 NavMeshAgent 与 Animator 分离?
【发布时间】:2018-03-02 01:03:23
【问题描述】:

我正在做一个使用 NavMeshAgent 的研究项目。我目前有一个非常简单的场景,其中代理在开始时产生,穿过“入口”触发对撞机,“退出”触发对撞机,然后最终与带有结束场景的脚本的“破坏者”触发对撞机发生碰撞。没有什么复杂的,不应该发生物理碰撞。

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

在这张图片中,您可以看到特工身上的两个对撞机(一个非常小的通过他的身体用于物理,一个较大的用于他的“个人空间”)出口触发对撞机(右侧的巨大红色框,)而漂浮在两者之间的是一个胶囊状的 NavMeshAgent 组件。

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

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

【问题讨论】:

    标签: unity3d unity5


    【解决方案1】:

    我遇到了完全相同的问题,将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;
    }
    

    【讨论】:

    • 这似乎只是将我的整个代理移动到每帧世界的位置 (0, 0, 0),而不是将 NavMeshAgent 居中在父节点上
    • 我还尝试让我的代理成为一个空对象的子对象并将 localPosition 设置为 (0, 0, 0) 但这只会导致代理原地行走。
    • @BRasmussen 将此脚本附加到您的游戏对象的根目录并确保 NavMeshAgent 是子组件,并将根的世界位置设置为代理的 nextPosition。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2019-05-27
    相关资源
    最近更新 更多