【问题标题】:(Unity C#) NPC Movement Script + Animations Not Running Smoothly(Unity C#) NPC 运动脚本 + 动画运行不流畅
【发布时间】:2018-10-28 02:41:02
【问题描述】:

我创建了一个跟随主要玩家的 NPC。当玩家在NPC的一定范围内时,NPC应该根据玩家与NPC的距离进行行走、奔跑和攻击。NPC附有一个C# MutantMovement Script,其中也包含动画。 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

【问题讨论】:

    标签: c# unity3d animation navmesh


    【解决方案1】:

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

    在您的状态机中,您可以设置转换:

    walking or attacking ---[trigger run]----> running animation
    running or walking -----[trigger attack]---> attack animation
    running or attacking ----[trigger walk] ---> walking animation
    

    这使得它整体上更容易,因为您不必在触发新动画状态时将其他布尔值设置为 false。

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

    【讨论】:

    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2017-07-04
    • 2015-04-24
    • 2011-07-28
    相关资源
    最近更新 更多