Как проверить, работает ли определенное состояние анимации от аниматора? - PullRequest
0 голосов
/ 21 мая 2018

Я создал аниматор под названием "m4a4animator".Внутри него основная функция называется «бездействующей» (ничего), а два других состояния: «стрелять» (mouse0) и «перезагружать» (R).Эти 2 состояния анимации переходят в режим ожидания.Теперь все работает ... но единственная проблема, которая у меня есть, заключается в следующем: если я нахожусь в процессе перезагрузки и нажимаю mouse0 (стрелять), состояние анимации сразу меняется, чтобы снимать ... но я хочу заблокировать это.

Теперь вопрос: как я могу остановить НЕКОТОРЫЕ изменения анимации во время работы анимации?

Вот мой аниматор

А вотмой сценарий:

using UnityEngine;
using System.Collections;

public class m4a4 : MonoBehaviour {

    public Animator m4a4animator;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (Input.GetKeyDown (KeyCode.R)) {

            m4a4animator.Play("reload");

        }

        if (Input.GetMouseButton(0)) {

            m4a4animator.Play("shoot");

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Для устаревшей системы анимации, Animation.IsPlaying("TheAnimatonClipName) используется, чтобы проверить, воспроизводится ли анимационный клип.


Для новой системы Mechanim Animator, вы должны проверить, если anim.GetCurrentAnimatorStateInfo(animLayer).IsName(stateName) и anim.GetCurrentAnimatorStateInfo(animLayer).normalizedTime < 1.0f) верно.Если они есть, то название анимации в данный момент воспроизводится.

Это можно упростить, как функцию, подобную функции Animation.IsPlaying выше.

bool isPlaying(Animator anim, string stateName)
{
    if (anim.GetCurrentAnimatorStateInfo(animLayer).IsName(stateName) &&
            anim.GetCurrentAnimatorStateInfo(animLayer).normalizedTime < 1.0f)
        return true;
    else
        return false;
}

Теперь все работает ... но единственная проблема, которая у меня естьзаключается в следующем: если я нахожусь в процессе перезагрузки и нажимаю mouse0 (стрелять), состояние анимации немедленно меняется на съемку ... но я хочу заблокировать это.

Когда кнопка съемкинажмите, проверьте, воспроизводится ли анимация «перезагрузки».Если это так, не стреляйте.

public Animator m4a4animator;
int animLayer = 0;

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.R))
    {
        m4a4animator.Play("reload");
    }

    //Make sure we're not reloading before playing "shoot" animation
    if (Input.GetMouseButton(0) && !isPlaying(m4a4animator, "reload"))
    {
        m4a4animator.Play("shoot");
    }
}

bool isPlaying(Animator anim, string stateName)
{
    if (anim.GetCurrentAnimatorStateInfo(animLayer).IsName(stateName) &&
            anim.GetCurrentAnimatorStateInfo(animLayer).normalizedTime < 1.0f)
        return true;
    else
        return false;
}

Если вам нужно дождаться окончания анимации «перезагрузки», прежде чем воспроизводить анимацию «съемки», используйте сопрограмму. В этом посте описано, как это сделать.

0 голосов
/ 21 мая 2018

Есть другие темы об этом: https://answers.unity.com/questions/362629/how-can-i-check-if-an-animation-is-being-played-or.html

if (this.animator.GetCurrentAnimatorStateInfo(0).IsName("YourAnimationName"))
{
    //your code here
}

это говорит вам, если вы находитесь в определенном состоянии.

Animator.GetCurrentAnimatorStateInfo(0).normalizedTime

это дает вам нормализованное времяанимация: https://docs.unity3d.com/ScriptReference/AnimationState-normalizedTime.html

Попробуйте поиграть с этими функциями, надеюсь, что решить вашу проблему

...