2017-02-01 10 views
2

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот вопрос был для школьного проекта, который не был закончен из-за этой ошибки. Проект будет завершен, предложение для будущих разработчиков может быть выполнено, но я не могу подтвердить какие-либо ответы, поскольку у меня больше нет доступа к исходному коду.Звук играет до тех пор, пока HTC Vive Controller касается Boxcollider [устаревший]

В настоящее время я создаю симуляцию барабанов для школьного проекта с использованием HTC Vive и Unity 3D.

Для того, чтобы сделать это, я использовал BoxCollider на томам и метод:

void OnCollisionEnter(Collision col) 
{ 
    GetComponent<AudioSource>().Play();   
} 

Так что звук воспроизводится, когда пульт HTC Vive затрагивает Тома. Беда в том, что звук продолжает играть до тех пор, пока пульт не касается тома вместо того, чтобы играть один раз при столкновении.

Я также пробовал метод OnTriggerEnter() с тем же результатом.

+0

Проверьте, отмечена ли опция Loop, отмеченная флажком в источнике звука, если да, то снимите флажок. Тебе все должно быть хорошо. Также проверьте сам аудиофайл, если он большой или маленький, просто зацикливая снова и снова. –

+0

@PrathamSehgal Спасибо за комментарий, но проект, над которым я работал, закончился, поэтому я закрою этот вопрос. – sh5164

ответ

0

создать переменную bool и использовать ее для управления воспроизведением только один раз.

bool isPlaying = false;//defined somewhere 
void OnCollisionEnter(Collision col) 
{ 
    if (!isPlaying) 
    { 
    GetComponent<AudioSource>().Play();   
    isPlaying = true; 
    } 
} 
+0

Я думал об этом, хотя это позволит воспроизводить звук один раз во всех симуляторах, а не один раз при столкновении, за исключением того, что есть способ вернуть его к «ложному» в нужное время. – sh5164

+0

u может установить его обратно в значение false, когда контроллер покидает tom – navylover

0

Вы можете использовать Coroutine, чтобы звук не повторялся на протяжении всего звукового клипа.

void OnCollisionEnter(Collision col) 
{ 
    if(!isPlaying) 
    { 
     AudioSource audio = GetComponent<AudioSource>(); 
     audio.Play(); 
     StartCoroutine(FinishSound(audio.clip.length)); 
    } 
} 

void OnCollisionExit(Collision col) 
{ 
    isPlaying = false; 
} 

IEnumerator FinishSound(float l) 
{ 
    yield return new WaitForSeconds(l);   
    isPlaying = false;   
} 

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

  • Нет связанных вопросов^_^