2016-03-21 2 views
1

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

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

Вот мой код;

void OnTriggerEnter(Collider other) 
{ 
    if (other.tag == "Pick Up") 
    { 
     if (!isPlayed) { 
      source.Play(); 
      isPlayed = true; 
     } 
    } 
    if (other.gameObject.CompareTag ("Pick Up")) 
    { 
     other.gameObject.SetActive (true); 
     count = count + 1; 
     SetCountText(); 
    } 
} 
+0

Источник звука имеет поле 'isPlaying', которое вы можете проверить. Вы попробовали это? –

+1

Да, это случай, когда вам нужно подождать в сопрограмме на .isPlaying - точно так же, как с анимацией. – Fattie

+1

@JoeBlow он должен сделать это в сопрограмме или иметь много bool в функции обновления. coroutine - это способ сделать это. – Programmer

ответ

2

Используйте сопрограмму, как сказал Джо. Начать coroutine каждый раз, когда включен конфликтный объект.

void OnTriggerEnter(Collider other) 
{ 
    if (other.tag == "Pick Up") 
    { 
     if (!isPlayed) { 
      source.Play(); 
      isPlayed = true; 
     } 
    } 
    if (other.gameObject.CompareTag ("Pick Up")) 
    { 
     other.gameObject.SetActive (true); 
     count = count + 1; 
     SetCountText(); 
     StartCoroutine(waitForSound(other)); //Start Coroutine 
    } 
} 



IEnumerator waitForSound(Collider other) 
    { 
     //Wait Until Sound has finished playing 
     while (source.isPlaying) 
     { 
      yield return null; 
     } 

     //Auidio has finished playing, disable GameObject 
     other.gameObject.SetActive(false); 
    } 
3

Вы можете скрыть объект, используя его renderer, а также отключить все коллайдеров, воспроизводить звук, а затем уничтожить/установить его в неактивное:

renderer.enabled = false; 
gameObject.collider.enabled = false; 

audio.PlayOneShot(someAudioClip); 
Destroy(gameObject, someAudioClip.length); //wait until the audio has finished playing before destroying the gameobject 
// Or set it to inactive 
Смежные вопросы