【问题标题】:Unity Navmeshagent won't face the target object when reaches stopping distanceUnity Navmeshagent 到达停止距离时不会面对目标对象
【发布时间】:2016-03-08 07:58:48
【问题描述】:

我正试图让 NPC 在我与主角交谈时看着他。我需要确保它看起来很自然并且他面对着我。我知道我可以做 Transform.LookAt() 但这太即时和不自然。

当我的角色停止移动时,我如何旋转 navmeshagent 以面对我的角色?

【问题讨论】:

    标签: unity3d path-finding navmesh


    【解决方案1】:

    试试这个来控制身体方向 - slerp 可以调节到你想要的旋转速度 (https://docs.unity3d.com/ScriptReference/Quaternion.Slerp.html):

    private void FaceTarget(Vector3 destination)
    {
        Vector3 lookPos = destination - transform.position;
        lookPos.y = 0;
        Quaternion rotation = Quaternion.LookRotation(lookPos);
        transform.rotation = Quaternion.Slerp(transform.rotation, rotation, [fill in desired rotation speed]);  
    }
    

    【讨论】:

    • 不是速度,而是步伐
    【解决方案2】:
    if(agent.remainingDistance < agent.stoppingDistance) 
    {
        agent.updateRotation = false;
        //insert your rotation code here
    }
    else {
        agent.updateRotation = true;
    }
    

    当您的代理距离低于 stopDistance 变量时,这将旋转您的代理。但是它看起来很不人道,所以如果您要使用人形 AI,我建议您查看 unity Mecanim demo(尤其是运动场景),因为它具有可以正确为代理设置动画的代码和动画。

    【讨论】:

      【解决方案3】:

      也许试试这个Head Look Controller。它非常流畅,并与动画融为一体!

      【讨论】:

      • 这看起来不错,但不是我想要的。基本上我需要找出如何在它低于停止距离时旋转整个 navmeshagent 身体以面对我的角色。但感谢您对此的参考。我一定要实现这个。
      • 好吧,在这种情况下,可以尝试将LookAt()Lerp 结合使用。不过,请确保将其置于更新循环中。
      • 我可以这样做,但它不会调用我的动画师进行静止转弯。它看起来不自然。这就是为什么我想知道是否有办法使用 navmeshagent 来执行此操作,因为它会调用空闲转弯动画。
      • 我知道这是一个老话题,但为了完整起见 - 您可以放入 lerp'd LookAt 代码 myAnimator.SetFloat ("myStationaryTurningFloat", turnValue) 行,以便更新动画师正确的动画。
      【解决方案4】:

      将字符放入游戏对象并将导航网格从字符复制到父对象,取消选中启用字符。也向上移动任何脚本。 花了 5 个小时才找到这个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        相关资源
        最近更新 更多