Unity - меняйте персонажа только когда анимация остановлена - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть два объекта (один и тот же символ, но в разных функциях), которые я хочу изменить, когда персонаж останавливается и когда он запускается по щелчку.Например, у меня есть Kick_Player, где анимация срабатывает по щелчку, а когда Kick_Player заканчивает анимацию, я хочу, чтобы она автоматически изменилась на Player_Stopped.Позы отличаются друг от друга, потому что это мне нужно сделать эти изменения.

Я пробовал что-то с this.MyAnimator.GetCurrentAnimatorStateInfo(0).IsName("My_Animation"), но у меня были неудачные попытки.Есть ли способ сделать это?

public class TapController : MonoBehaviour {

    Animator Anim;

    public GameObject CharacterToController; //Kick_Player
    public GameObject CharacterToBeStopped; //Player_Stopped

     void Start(){
      Anim = CharacterToController.GetComponent<Animator>();
      CharacterToBeStopped.SetActive(false);
     }

     void Update(){
      if(input.GetMouseButtonDown(0)){
       if(!CharacterToController.activeSelf){
        CharacterToController.SetActive(true);
       }

       Anim.Play("Kick_Ball");


     if(!this.Anim.GetCurrentAnimatorStateInfo(0).IsName("Kick_Ball") {
        CharacterToController.SetActive(false);
        CharacterToBeStopped.SetActive(true);
      }
     }

}

Я сделал этот код для тестирования, но он не работает

1 Ответ

0 голосов
/ 18 сентября 2018

Использование функции IsName требует, чтобы вы указали префикс имени основного слоя состояния анимации перед фактическим состоянием анимации.

Базовое имя по умолчанию обычно «Базовый слой»

enter image description here

if(!this.Anim.GetCurrentAnimatorStateInfo(0).IsName("Base Layer.Kick_Ball") 

Обратите внимание, что вы должны делать это вне вашего if(input.GetMouseButtonDown(0)){, иначе у вас никогда не будет шанса быть проверенным.


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

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        if (!CharacterToController.activeSelf)
        {
            CharacterToController.SetActive(true);
        }

        Anim.Play("Kick_Ball");

        StartCoroutine(PlayAndWaitForAnim(Anim, "Kick_Ball"));
    }
}


const string animBaseLayer = "Base Layer";
int animHash = Animator.StringToHash(animBaseLayer + ".Kick_Ball");

public IEnumerator PlayAndWaitForAnim(Animator targetAnim, string stateName)
{
    targetAnim.Play(stateName);


    //Wait until we enter the current state
    while (targetAnim.GetCurrentAnimatorStateInfo(0).fullPathHash != animHash)
    {
        yield return null;
    }

    float counter = 0;
    float waitTime = targetAnim.GetCurrentAnimatorStateInfo(0).length;

    //Now, Wait until the current state is done playing
    while (counter < (waitTime))
    {
        counter += Time.deltaTime;
        yield return null;
    }

    //Done playing. Do something below!
    Debug.Log("Done Playing");

    CharacterToController.SetActive(false);
    CharacterToBeStopped.SetActive(true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...