Playing Audio After Destruction

What a wonderful Saturday to post some information, am I right?

Today I am focusing on how to play an audio clip after an enemy is destroyed. It took me a little bit to understand how it works so I thought I would post how I did it just in case this could potentially help someone.

So the scenario is that when the eyeball enemy in my game is getting hit I want it to play an audio clip (hit noise)  and then after the eyeball is destroyed I want it to play another clip (destruction).

The Enemy Object Setup

  1. First created a parent object called Eyeball
  2. Then, I attached an Audio Source Component to it and left the AudioClip blank

3. Next, I created a child object inside of the parent and also named it Eyeball (confusing I know but this was a workaround that I will probably update later, or not…we shall see) and attached an Eyeball Controller script to it.

4. Inside the script, I have a reference to the AudioSource that is on the parent object and I also have a reference to two Audio Cips: Enemy Hit (when the enemy is hit), and Enemy Destroyed (when the enemy is destroyed).

The Eyeball Controller Setup

I have stripped everything out of this code that isn’t audio related to the topic I am talking about right now.

  1. In the script you can see there is a currentHealth variable for the enemy as well as the three other components we talked about earlier (an AudioSource and two AudioClips).
  2. Then, in the Start Method, you assign the enemyAudioSource.
  3. There is a Method called TakeDamage which I give to my PlayerController. This script is used when the collider from the player collides with the enemy and causes damage. For this example lets say 5 damage is given to this Method, so now damageAmount = 5.
  4. When the TakeDamage Method is fired you can see that I assign the enemyAudioSource.clip to equal the enemyHit SoundClip. The enemyAudioSource then begins to play (this will be the enemy being hit sound).
  5. The currentHealth of the enemy is then reduced by the damageAmount.
  6. If  the currentHealth is <= 0, the enemyAudioSource.clip is replaced with the enemyDestroyed AudioClip. The enemyAudioSource then begins to play (this will be the enemy being destroyed sound).
  7. The Method for DestroyEnemy() begins which just destroys the enemy child object.

[sourcecode language=”csharp”]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EyeballController : MonoBehaviour {

[Header("—–Health—–")]
public int currentHealth;

[Header("—–Sounds—–")]
public AudioSource enemyAudioSource;
public AudioClip enemyHit;
public AudioClip enemyDestroyed;

private void Start()
{
enemyAudioSource = GetComponentInParent&lt;AudioSource&gt;();
}

public void TakeDamage(int damageAmount)
{
enemyAudioSource.clip = enemyHit;
enemyAudioSource.Play();

currentHealth -= damageAmount;

if(currentHealth &lt;= 0)
{
enemyAudioSource.clip = enemyDestroyed;
enemyAudioSource.Play();

DestroyEnemy();
}
}

void DestroyEnemy()
{
Destroy(gameObject);
}
}
[/sourcecode]

Back To The Eyeball Parent

The last thing I did was attach a script called DestroyEnemyContainer to the Eyeball Parent. The script is very simple and will just look to see if there are any children attached to the parent and if there is not it will destroy the parent after 3 seconds.

[sourcecode language=”csharp”]

public class DestroyParentContainer : MonoBehaviour
{
private void Update()
{
//Debug.Log("Number of children: " + transform.childCount);

if (transform.childCount <= 0) // if this object is the last child
{
Destroy(transform.gameObject, 3.0f); // destroy parent a few frames later
}
}
}

[/sourcecode]

Leave a Reply

Your email address will not be published. Required fields are marked *