2016-05-19 2 views
0

Я новичок в Unity и начинающий программист. Я экспериментировал с графическим интерфейсом Unity (холст, кнопка, ярлык и т. Д.).Как воздерживаться от ввода кнопки до тех пор, пока анимация не закончит игру в единстве 5?

Для кнопки я создал класс ButtonClickScript, так что, когда я постучал по кнопке, переменная waterBucketAmnt увеличилась бы до достижения 3. Затем я решил немного поэкспериментировать, поэтому я создал очень простой анимация парня, сбрасывающего ведро с водой. Я хотел ограничить количество раз, когда парень мог сбросить воду с помощью waterBucketAmnt.

Я могу нажать кнопку GUI 3 раза, и все работает нормально. int waterBucketAmnt = 3. Затем я запускаю игру и нажимаю настроенное действие «Fire3» на клавиатуре, и оно выполняется точно так, как ожидалось. Проблема в том, что я могу нажимать действие «Fire3» последовательно менее чем за секунду, поэтому waterBucketAmnt = 0 и анимация воспроизводится только один раз. Как я могу отложить ввод до завершения анимации?

using UnityEngine; 
using System.Collections; 

public class waterBucketAction : MonoBehavior { 

Animator waterAnim; 
// a simple player controller using unity's RigidBody2D feature. I added PlayerControllerScript so that I could make sure the player had to remain on the ground in order to dump the bucket of water. checkGround is so that I could inherit the grounded gameObject I created. 

PlayerControllerScript checkGround; 
public ButtonClickScript checkWaterAmnt; 

void Start() { 
    checkGround = FindObjectOfType <playerControllerScript>(); 
    waterAnim = GetComponent<Animator>(); 
} 

void FixedUpdate() { 
    waterAnim.SetBool ("isPlaying", false); 

    if (checkWaterAmnt.waterBucketAmnt > 0 && !waterAnim.GetCurrentAnimatorStateInfo(0).IsName("waterBucketAnimation")) { 

     if (checkGround.grounded == true && Input.GetButtonDown ("Fire3")) { 
      waterAnim.SetBool("isPlaying", true); 

      //I need to wait for the animation to complete or delay the input. I searched multiple places and the best answer I could find was Animation.IsAnimating, but that seems to be deprecated? The API says that Animator replaced Animation, but I couldn't find an equivalent method. 
      if(waterAnim.GetCurrentAnimatorStateInfo(0).IsName("waterBucketAnimation")) 
       checkWaterAmnt.waterBucketAmnt -=1; 
     } 
    } 

ответ

2

Я предполагаю, что вы ButtonClickScript выглядит следующим образом:

public class ButtonClickScript : MonoBehavior, IPointerClickHandler 
{ 
    public int waterBucketAmnt; 

    void OnPointerClick() 
    { 
     if (waterBucketAmnt < 3) 
      waterBucketAmnt++; 
    } 
} 

Так что вам нужно сделать, чтобы задержать вход изменить Interactable состояние кнопки после щелкнули, добавив следующую строку:

if (waterBucketAmnt < 3) 
{ 
    waterBucketAmnt++; 
    this.GetComponent<Button>().Interactable = false; 
    //If Interactable is not accessible from code you could also use 
    //this.gameObject.SetActive(false); 
} 

Затем в waterBucketAction сценарий, вам нужно изменить Interactable состояние кнопки назад true после того, как анимация закончена:

void FixedUpdate(} 
{ 
    //The 0 is the Layer Index 
    if (this.animator.GetCurrentAnimatorStateInfo(0).IsName("YourWaterAnimationName")) 
     checkWaterAmnt.GetComponent<Button>().Interactable = true; 
} 
+0

yes stateinfo - правильный путь – LumbusterTick

+0

Поэтому я отложил его с помощью StateInfo; однако я понятия не имею, почему это работает. Мой код должен быть обновлен до того, что у меня есть сейчас. По какой-то причине мне пришлось использовать StateInfo дважды. Я не понимаю, почему это так, но я попытался удалить один, и я все еще мог бы отвлечь waterAmnt, щелкнув мышью 3 раза, пока анимация воспроизводилась один раз. Я чувствую, что моя программа очень неэффективна, но на данный момент это не имеет большого значения. Есть идеи о том, почему работает мой код? – QuirkyCoder

+0

Что вы подразумеваете под «использованием StateInfo дважды»? Не могли бы вы показать обновленный код? Также, если это решит вашу проблему, пожалуйста, пометьте ответ как правильный. Благодарю. – Agustin0987

0

Вы могли бы сделать метод для записи количества времени вы нажали «fire3», если она меньше или равна waterBucketAmnt, а затем петля waterAnim на номер на время, равное к номеру записанного номера. Когда анимация воспроизводится, она не будет увеличивать значение fireCount и будет увеличиваться только тогда, когда анимация будет выполнена. Что-то в строке этого

void Update() { 


    if (!animation.IsPlaying("yourWaterAnimationName")) 
    { 
     if (Input.GetButtonDown("Fire3")) 
     { 
      if (fireCount < waterBucketAmnt) 
      { 
       fireCount++; 
      } 
     } 
    } 
    for (int i = 0; i < fireCount; i++) 
    { 
     animation.PlayQueued("yourWaterAnimationName"); 
     waterBucketAmnt--; 
     fireCount--; 
    } 


} 
+0

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

Смежные вопросы