- Home /
Can't play any sounds. What's wrong?
I'm trying to play an audio clip when my player collects a powerup. Is there something wrong with this code?
void OnTriggerEnter2D (Collider2D other)
{
if (other.tag == "Player")
audio.Play();
jumper.jumpAttempts ++;
Destroy (gameObject);
}
Also, how to play sounds only ONCE if a condition is met? Since everything happens in Update() , if I use a conditional statement i just end up firing off my sound every frame.
if (Input.GetKeyDown("escape"))
{
paused = !paused;
myAudio.Play();
}
if(paused)
{
Time.timeScale = 0;
}
else
{
Time.timeScale = 1;
}
I can play a sound like this but that is only because the player presses the Escape button. I tried PlayOneShot but the results were the same. Ultimately I would like to have one sound on pause and another on play. With my current code I can only have 1.
Hello,
You destroy the object where your audiosource is attached so the sound is never playing. you should use PlayOneShot() for that.
To know if a sound is playing u can check the variable:
finally use an array of clips to handle the different sounds you need
cheers
Answer by sethuraj · Jul 22, 2014 at 07:21 AM
For the first code snippet you are trying to call audio.Play(); on a destroyed object.For calling audio on destroying object use something like this.Use another script like SoundManager.cs on a gameobject named SoundManager for playing sounds.
//SoundManager.cs script
public class SoundManager:MonoBehaviour
{
void Start()
{
//Create the audio source
//Load the audio clip
}
//The public function we will use to call to play the sound
public void PlayJumpSound()
{
//Play the sound
audio.play();
}
}
Now use your trigger scrpit like this
void OnTriggerEnter2D(Collider2D other)
{
if(other.tag=="Player"
{
//Play the audio
GameObject.Find("SoundManager").GetComponent<SoundManager>().PlayJumpSound();
//Incriment the jump attempts
jumper.jumpAttempts++;
//Destroy the gameobject
Destroy(gameObject);
}
}
The update function will call once per frame.That is if your FPS is 60,the Update() method will call 60 times a second.using audio.Play() directly in this method will keep on calling this method which will not give you the proper result.Use a boolean to make sure the function will only get called once
bool IsSoundPlayed=false;
if (Input.GetKeyDown("escape"))
{
paused = !paused;
if(!IsSoundPlayed)
{
myAudio.Play();
IsSoundPlayed=true;
}
}
if(paused)
{
Time.timeScale = 0;
//State to false
IsSoundPlayed=false;
}
else
{
Time.timeScale = 1;
//State to false
IsSoundPlayed=false;
}
Omg thanks, I can't believe I couldn't come up with a solution by using a second bool.
As for the object destruction, kinda counter intuitive but does make some sense. Thank you.
Your answer
Follow this Question
Related Questions
Background Music 2 Answers
Play Audio Through Scenes 0 Answers
Audio wont play when conditions are met 1 Answer
Play An Audio Clip When An Instantiated Object Collides 1 Answer
Help with sound clips [C#] 0 Answers