- Home /
Delay audio collisions
Hi there,
As means of explaining my scene, I have two cubes (cube1 and cube2), a fountain particle system and audio for it. Cube1 is a trigger to allow cube2 to work, so cube2 will only trigger the fountain AFTER cube1 has been collided with, even if you walk into cube2 prior.
This works very well but the audio plays whenever you collide with cube2. Am I able to do something similar to the particles? Can I script the audio to only start once you collide with cube2 only after you have collided with cube1??
Hope this makes sense, my code is:
var fountain: GameObject;
var splash: GameObject;
var enable: boolean = false; // boolean flag: enable trigger 1 when true
function Awake(){
fountain.particleEmitter.emit = false;
splash.particleEmitter.emit = false;
}
// function called by trigger2 via SendMessage:
function EnableTrigger(onOff: boolean){
enable = onOff;
}
function OnTriggerEnter(trigger: Collider){
if (enable){
fountain.particleEmitter.emit = true;
splash.particleEmitter.emit = true;
}
}
function OnTriggerExit(trigger:Collider){
if (enable){
yield WaitForSeconds(2);
fountain.particleEmitter.emit = false;
yield WaitForSeconds(2);
splash.particleEmitter.emit = false;
}
}
Code for Trigger2:
var trigger1: GameObject; // drag trigger1 object here
var trigger2: GameObject;
var trigger3: GameObject;
var trigger4: GameObject;
var trigger5: GameObject;
var trigger6: GameObject;
var trigger7: GameObject;
var trigger8: GameObject;
var trigger9: GameObject;
function OnTriggerEnter(other: Collider){
// call EnableTrigger(true) in trigger 1
trigger1.SendMessage("EnableTrigger", true);
trigger2.SendMessage("EnableTrigger", true);
trigger3.SendMessage("EnableTrigger", true);
trigger4.SendMessage("EnableTrigger", true);
trigger5.SendMessage("EnableTrigger", true);
trigger6.SendMessage("EnableTrigger", true);
trigger7.SendMessage("EnableTrigger", true);
trigger8.SendMessage("EnableTrigger", true);
trigger9.SendMessage("EnableTrigger", true);
}
From the same post, "Optimization is not about avoiding expensive code. It's about avoiding expensive code where it matters". This code will be called infrequently, thus the perfomance gain using GetComponent is negligible.
Answer by aldonaletto · May 26, 2012 at 11:27 PM
If the audio is a loop (as fountain sounds usually are), you can Play the audio when start emitting particles, and Stop it when finishing emitting:
... function OnTriggerEnter(trigger: Collider){ if (enable){ fountain.particleEmitter.emit = true; fountain.audio.Play(); splash.particleEmitter.emit = true; splash.audio.Play(); } }
function OnTriggerExit(trigger:Collider){ if (enable){ yield WaitForSeconds(2); fountain.particleEmitter.emit = false; fountain.audio.Stop(); yield WaitForSeconds(2); splash.particleEmitter.emit = false; splash.audio.Stop(); } } ...
Once again Aldo you make it look so easy!! Thank you very much :) Done and Done
Your answer
Follow this Question
Related Questions
trigger audio and text from array 0 Answers
iOS - Audio Lag? 1 Answer
odd audio delay 1 Answer
AudioClip Precise Timing and Delay 1 Answer
Footsteps sound on collision problem, please help!!! 0 Answers