统一计算动态停止距离

时间:2018-09-11 15:39:33

标签: unity3d

为控制NammeshAgent,到达目标后停止,我使用了OnAnimatorMove()。但是到达目的地后,运行动画不会停止。

我将BlendTree用于控制动画。这是我的代码:

    using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

//  private vriables
private Animator anim;
private NavMeshAgent navAgent;
public Transform target;
private float speed;

void Start()
{
    anim = GetComponent<Animator>();
    navAgent = GetComponent<NavMeshAgent>();
}

void Update()
{
    MoveToDestination();
}

private void MoveToDestination()
{
    // Move to Target
    if (Vector3.Distance(transform.position, target.position) > navAgent.stoppingDistance)
    {
        speed = 1f;
        navAgent.SetDestination(target.position);
    }
    else
    {
        speed = 0;
    }

    anim.SetFloat("Speed", speed, 0.1f, Time.deltaTime);
}

private void OnAnimatorMove()
{
    navAgent.speed = (anim.deltaPosition / Time.deltaTime).magnitude;
}

注意:当NavmeshAgent到达目标时,NavmeshAgent组件中的速度值大于1。我在下面的打印行中看到了这一点。

Vector3.Distance(transform.position, target.position)

注意:我在NavMesh组件中将StoppingDistance设置为0。

所以我需要动态计算玩家和目标之间的停止距离。

2 个答案:

答案 0 :(得分:0)

您的代码有一些小问题:

  • 您设置了speed = 0;,但除了navAgent.speed之外,我都没有定义任何速度-确保您使用正确/预期的变量!
  • Vector3.Distance(transform.position, target.position) > navAgent.stoppingDistance基本上是distance > 0-用0.2f或其他一些较小的值替换StoppingDistance。距离几乎永远不会完全为零,因此(几乎)总是> 0。

一些想法:

  • 您可以将动画的速度设置为座席速度,这样,如果播放器不移动,动画将“运行”但实际上不会移动。同样,它会随着加速度自动缩放。也许您的blendTree也可以更好地工作。
  • 您为什么将停止距离设为0?

答案 1 :(得分:0)

这是问题所在,我已将其删除。

private void OnAnimatorMove()
{
    navAgent.speed = (anim.deltaPosition / Time.deltaTime).magnitude;
}

并且我还将StoppingDistance设置为无零。