Хорошо, есть несколько причин, почему это не работает:
Для одного 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 секунды, вы также можете прервать его воспроизведение, как только пользователь перестанет нажимать кнопку.