(Unity C#)NPC运动脚本+动画运行不流畅

时间:2018-10-28 02:41:03

标签: c# unity3d animation navmesh

我创建了一个跟随主要玩家的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;
    }
}

Animation Controller

1 个答案:

答案 0 :(得分:0)

在您的特定情况下,我将使用Animator触发器而不是布尔值,因此从一个动画到另一个动画的过渡仅触发一次。

然后,您可以在状态机中将转换设置为:

 "scripts": {
   "start": "node %NODE_DEBUG_OPTION% server.js"  
 }

它使整体操作变得更加容易,因为您无需在触发新的动画状态时将其他布尔值设为false。

您可以检查以确保过渡是流畅的另一件事是查看动画的退出时间-如果关闭“具有退出时间”,则过渡将是即时的。如果打开动画控制器,然后单击状态机转换箭头,则可以找到此选项。