为控制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。
所以我需要动态计算玩家和目标之间的停止距离。
答案 0 :(得分:0)
您的代码有一些小问题:
speed = 0;
,但除了navAgent.speed之外,我都没有定义任何速度-确保您使用正确/预期的变量!Vector3.Distance(transform.position, target.position) > navAgent.stoppingDistance
基本上是distance > 0
-用0.2f
或其他一些较小的值替换StoppingDistance。距离几乎永远不会完全为零,因此(几乎)总是> 0。一些想法:
答案 1 :(得分:0)
这是问题所在,我已将其删除。
private void OnAnimatorMove()
{
navAgent.speed = (anim.deltaPosition / Time.deltaTime).magnitude;
}
并且我还将StoppingDistance设置为无零。