How to prevent sound effects playing every frame?
I am making a horror game in a team of people at university and I am handling all of the audio for the game.
To do this, I store the audio clips in a dictionary and I instantiate a prefab game object with an AudioSource each time a sound effect is played to play that sound effect.
I am having problems where multiple prefabs of the same sound effect is being created (because they are being tested and created in update)
To try solve this I tried creating the following function to test if there is already a game object with the same AudioSource clip in the scene, and if there is, don't play anything. To do this test I first add the name of the audio clip to each prefab instance and test this against the sound effect being tested. This is how I spawn each instance:
public void PlaySFX(SFX sfx)
{
//creates instance of sfx prefab and gets the audio source component
AudioSource sfxAudio = Instantiate(SFXPrefab).GetComponent<AudioSource>();
//Add audio clip name to the end of each instance (used to test later)
sfxAudio.gameObject.name = sfxAudio.gameObject.name + "_" + SFX_Dictionary[sfx].name;
//Plays sfx once
sfxAudio.PlayOneShot(SFX_Dictionary[sfx]);
//Destroy instance once sfx has been played
Destroy(sfxAudio.gameObject, SFX_Dictionary[sfx].length);
}
This is how I test for an existing SFX playing:
public bool CanPlaySound(SFX sfx)
{
//array of gameobjects with "SFX" tag
var audioSources = GameObject.FindGameObjectsWithTag("SFX");
bool isAlreadyPlaying = false;
//string of the clip name being tested
string clipName = SFX_Dictionary[sfx].name;
//loops through the array and sets AlreadyPlaying to true if there is
//a gameobject that contains the name of the sfx
for (int i = 0; i < audioSources.Length - 1; i++)
{
string asName = audioSources[i].GetComponent<AudioSource>().clip.name;
if (asName.Contains(clipName))
{
isAlreadyPlaying = true;
}
}
if (isAlreadyPlaying)
{
return false;
} else
{
return true;
}
}
I am however receiving an error to do with the audio clip name and the function isn't working correctly.
I was wondering if someone could help me with this problem?
or suggest a better way to stop sound effects playing every frame?
Your answer
Follow this Question
Related Questions
Few AudioSources as components on one gameobject 1 Answer
Unity Sound Glitched up (in 2D) 0 Answers
How can i make countdown tick-tock sound ? 0 Answers
Sound Levels vary between levels with same settings? 2 Answers
How to make auto play and off sound when target object is found and dissapear? 0 Answers