(Unity C #) Скрипт движения NPC + анимация не работает гладко - PullRequest
0 голосов
/ 28 октября 2018

Я создал NPC, который следует за основным игроком.Когда игрок находится в определенном диапазоне NPC, NPC должен ходить, бегать и атаковать в зависимости от расстояния между игроком и NPC. NPC имеет прикрепленный скрипт C # MutantMovement, который также содержит анимации.NPC также является Агентом НавМеш.Моя проблема в том, что анимации не работают гладко с логикой.Я надеюсь, что кто-то может помочь.Ниже представлен сценарий 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;
    }
}

контроллер анимации

1 Ответ

0 голосов
/ 28 октября 2018

Я бы использовал триггеры Animator, а не логические значения в вашем конкретном случае, поэтому переходы от одной анимации к другой запускаются только один раз.

В вашем автомате вы можете установить переходы следующим образом:

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

В целом это упрощается, так как вам не нужно переключать другие значения bool в false при запуске новогоСостояние анимации.

Еще одна вещь, которую вы можете проверить, чтобы убедиться, что переходы плавные, это посмотреть на время выхода вашей анимации - если вы выключите «Имеет время выхода», ваши переходы будут мгновенными.,Вы можете найти эту опцию, если откроете контроллер аниматора и нажмете стрелку перехода к конечному автомату.

...