x


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);
}
more ▼

asked May 26 '12 at 10:37 PM

mcfetrmatt gravatar image

mcfetrmatt
21 6 10 12

Do yourself a favor, do not use SendMessage(). Here's a quick reason: http://forum.unity3d.com/threads/38094-Is-SendMessage-really-that-bad?p=245838&viewfull=1#post245838

May 26 '12 at 11:15 PM bruflot

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.

May 26 '12 at 11:37 PM aldonaletto
(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

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();
  }
}
...
more ▼

answered May 26 '12 at 11:27 PM

aldonaletto gravatar image

aldonaletto
41.5k 16 42 197

Once again Aldo you make it look so easy!! Thank you very much :) Done and Done

May 26 '12 at 11:41 PM mcfetrmatt
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x1029
x986
x179

asked: May 26 '12 at 10:37 PM

Seen: 375 times

Last Updated: May 26 '12 at 11:41 PM