Play audio on game over GUI load or player death


I would like to play audio when a player dies/when the game over GUI appears. I am currently using the audio.Play(); command however it plays repeatedly despite disabling audio loop on the actual audio clip.

Is there a way to play this audio clip once whilst leaving the command in the same location or is best practice to use another method?

Thank you for your assistance in advance. As a newb I’m banging my head against the learning curve on this one!

This is the C# script I am using:

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {
// The score that the player currently has
public int curScore;
// The highest score the player has reached (saved)
private int highscore;
// Reference to our custom gui skin
public GUISkin skin;
// Values defining the width and height of our game over screen
public Vector2 losePromptWH;
// Boolean to check if we need to end the game or not
public bool showGameOver;

void Start () {
	// Grab the last saved highscore from the player prefs file
	highscore = PlayerPrefs.GetInt("Highscore");

void Update () {
	// If the player died and our current score is greater than our saved highscore
	if (showGameOver && curScore > highscore)
		// Set the highscore to our current score
		highscore = curScore;
		// Now save the score as our new highscore
		PlayerPrefs.SetInt("Highscore", highscore);

void OnGUI()
	// Set the GUI's skin to our custom skin = skin;
	// Show our current score value at the top center of the screen 
	// (note: it uses the custom Score style in our skin)
	GUI.Label (new Rect(Screen.width/2 - 100,10f,200,200), curScore.ToString(), skin.GetStyle("Score"));
	// If the player died, show the game over screen
	if (showGameOver)
		// Define the screen space for the game over window
		Rect currentGameOver = new Rect(Screen.width/2 - (losePromptWH.x/2), Screen.height/2 - (losePromptWH.y/2), losePromptWH.x, losePromptWH.y);
		// Generate a box based on the game over window rectangle
		GUI.Box (currentGameOver, "Game Over", skin.GetStyle("GAME OVER"));
		// Draw our current score within the game over window
		//GUI.Label(new Rect(currentGameOver.x + 15f, currentGameOver.y + 50f, currentGameOver.width * .5f, currentGameOver.height * .25f), "Score: " + curScore.ToString());
		// Draw our highscore within the game over window (if the highscore was beaten, it will show your current score)
		GUI.Label(new Rect(currentGameOver.x + 15f, currentGameOver.y + 70f, currentGameOver.width * .9f, currentGameOver.height * .35f), " Highest Score: " + highscore.ToString());
		// Draw a replay button on screen and check to see if it was clicked
		if (GUI.Button (new Rect(currentGameOver.x + (currentGameOver.width - 225), currentGameOver.y + (currentGameOver.height - 80), 130, 60), "", skin.GetStyle("Play")))
			// If it is clicked, reload the level
			// Load the highscore from our save file
			highscore = PlayerPrefs.GetInt("Highscore");



Thanks Christoph_r

Ended up adding two sound sources to the player and then specifying it under the game manager GUI



The script now looks like this:

public class MainCharacter : MonoBehaviour {
// Value that controls the amount of force applied when clicking
public float tapForce;

// A reference to the map class

//public Map map;

// Reference to the manager class
public GameManager manager;

// Bool to check if we've died or not
private bool isDead;

//Add audio source

public AudioClip sound1;

public AudioClip sound2;

void Update () 
	// Check to see if we're clicking and if we've not already died
	// (don't want to be able to move if we're dead)
	if (Input.GetMouseButtonDown(0) && !isDead && !(Camera.main.WorldToViewportPoint(transform.position).y > 1f))
		// Add our tapForce to our bird's velocity if we do click
		rigidbody2D.velocity = new Vector2(0f, tapForce);
		// Control the rotation of the bird based on its velocity
		transform.rotation = Quaternion.RotateTowards(Quaternion.Euler(0f,0f,0f), Quaternion.Euler(0f,0f,90f), rigidbody2D.velocity.y);
	} else if (rigidbody2D.velocity.y < -.05) 
		// Do the same here except only if it is falling
		transform.rotation = Quaternion.RotateTowards(Quaternion.Euler(0f,0f,0f), Quaternion.Euler(0f,0f, -90f), -rigidbody2D.velocity.y * 4f);

// Check to see if we hit ANYTHING that's not a trigger
void OnCollisionEnter2D(Collision2D other)

	if(other.gameObject.tag == "BackGround")
            //Specify which audio clip to use and then play  
            audio.clip = sound1;
            // If we have, call the bird's die method
            Die ();
    //Destroy game object delayed in order to allow the sound enough time to play on die
    Destroy(gameObject, .15f);

// If we hit a trigger, we know it is a gate trigger
void OnTriggerEnter2D(Collider2D other)

	// In that case, add one to our player's score
	manager.curScore += 1;
	other.collider2D.enabled = false;
            //Specify which audio clip to use and then play
            audio.clip = sound2;

// Method that controls the bird's death
void Die()
	// Set a boolean of isDead to true so that we can do some checks later
	isDead = true;
	// Force the Game Over window to pop up and generate our highscore
	manager.showGameOver = true;