我创建了一个跟随主要玩家的NPC。当玩家在NPC的某个范围内时,NPC应该根据玩家与NPC之间的距离行走,奔跑和攻击.NPC附带了一个C#MutantMovement脚本,其中还包含动画。 NPC也是NavMesh代理。我的问题是,动画在逻辑上无法顺利运行。我希望有人能帮帮忙。下面是MutantMovement脚本和动画控制器。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
[RequireComponent (typeof (NavMeshAgent))]
[RequireComponent (typeof (Animator))]
public class MutantMovement : MonoBehaviour {
[SerializeField] private float _range = 10f;
public Transform _goal; // destination
public Transform _player;
private Animator _anim;
private bool _alive;
private float _distance;
private NavMeshAgent _agent;
void Start ()
{
_goal = GameObject.Find("Player").transform;
_player = GameObject.Find("Player").transform;
_alive = true;
// get a reference to the NavMesh Agent component
_agent = GetComponent<NavMeshAgent>();
_anim = GetComponent<Animator>();
}
void Update()
{
Vector3 direction = _goal.position - this.transform.position;
float angle = Vector3.Angle(direction, this.transform.forward);
if(Vector3.Distance(_goal.position, this.transform.position) < 10 &&
angle < 50){
_anim.SetBool("isIdle", false);
if ((_alive && direction.magnitude > 5))
{
_agent.destination = _goal.position;
_anim.SetBool("isWalking", true);
_anim.SetBool("isAttacking", false);
_anim.SetBool("isRunning", false);
if((_alive && direction.magnitude > 6.5)){
_agent.destination = _goal.position;
_anim.SetBool("isRunning", true);
_anim.SetBool("isWalking", false);
_anim.SetBool("isAttacking", false);
}
}
else{
_agent.isStopped = false;
_anim.SetBool("isAttacking", true);
_anim.SetBool("isWalking", false);
_anim.SetBool("isRunning", false);
}
}else{
_anim.SetBool("isIdle", true);
_anim.SetBool("isWalking", false);
_anim.SetBool("isAttacking", false);
}
}
public void SetAlive(bool alive)
{
_alive = alive;
}
}
答案 0 :(得分:0)
在您的特定情况下,我将使用Animator触发器而不是布尔值,因此从一个动画到另一个动画的过渡仅触发一次。
然后,您可以在状态机中将转换设置为:
"scripts": {
"start": "node %NODE_DEBUG_OPTION% server.js"
}
它使整体操作变得更加容易,因为您无需在触发新的动画状态时将其他布尔值设为false。
您可以检查以确保过渡是流畅的另一件事是查看动画的退出时间-如果关闭“具有退出时间”,则过渡将是即时的。如果打开动画控制器,然后单击状态机转换箭头,则可以找到此选项。