Невозможно заставить сопрограмму запускаться и останавливаться, когда кнопка нажата - PullRequest
0 голосов
/ 19 июня 2019

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

  private IEnumerator audioPlayCoroutine;

public AudioSource[] steps;
public AudioSource[] cabinSteps;

private bool running;

void Start()
{
    running = false;

    audioPlayCoroutine = AudioPlay();
}
void Update()
{
    if (Input.GetKey("w"))
    {
        if (running == false)
        {
            running = true;
        }
    }

    if (running == true)
    {
        StartCoroutine(audioPlayCoroutine);
    }

    else if (running == false)
    {
        StopCoroutine(audioPlayCoroutine);
    }

}
IEnumerator AudioPlay()
{
    int ran = Random.Range(0, 4);        

    steps[ran].Play();

    yield return new WaitForSeconds(2);
}

1 Ответ

0 голосов
/ 19 июня 2019

Хорошо, есть несколько причин, почему это не работает:

Для одного running никогда не устанавливается значение false. Как только ваш игрок нажмет w один раз, он останется true. Вместо этого напишите

if (Input.GetKey("w"))
  running = true;
else
  running = false;

Кроме того, вы запускаете и останавливаете свой сопрограмму несколько раз. Вместо этого вы должны либо проверить, изменился ли статус выполнения, либо просто проверить running в своей сопрограмме. Тогда это может выглядеть так:

void Start() {
  running = false;
  audioPlayCoroutine = AudioPlay();
  StartCoroutine(audioPlayCoroutine);
}

void Update() {
  if (Input.GetKey("w"))
    running = true;
  else
    running = false;
}

IEnumerator AudioPlay()
{
  while (true) {
    if(!running)
      yield return new WaitForSeconds(0);

    int ran = Random.Range(0, 4);  

    steps[ran].Play();

    // if you want it to play continuously, you can use the clip length for
    //   the sleep. This way it will start playing the next clip right after 
    //   this one is done. If you don't want that, go with your code
    yield return new WaitForSeconds(steps[ran].clip.length);
  }
}

Если ваш клип на самом деле длится 2 секунды, вы также можете прервать его воспроизведение, как только пользователь перестанет нажимать кнопку.

...