The question is answered, right answer was accepted
Audio not playing in game
Hi fellow Devs,
Since I am new to Unity and game scripting this might be a simple fix (hoping it will be). I've spent the last 2 days trying different suggested solutions and I come up short somehow.
So here we go. I have a sound that I want to play when I press a button in this case the "a" button, but I can't get the sound to play for the life of me. I have attached an audiosource to the object (letterbox A). With my understanding I should then be able to use the Play function to play the audio.
So what I have done is the following:
function Update ()
{
if (Input.GetKeyDown("a"))
{
var audio : AudioSource = GetComponent.<AudioSource>();
audio.Play();
Destroy(gameObject);
}
}
So what currently happens is, the script compiles successfully and I can run the game in the game window. Once I press the A button the object is removed from the game, but there are no sounds triggered. However if I select the "Play on Awake" setting in the AudioSource that is attached to the object and I start the game, the sound plays.
So I then moved on to make some adjustments by adding the following to the top of the code as I have seen in the unity manual:
#pragma strict
@RequireComponent(AudioSource)
However when I save the script I get the following error: BCE0153: 'UnityEngine.RequireComponent' can be applied on one of these targets only : Class. I tried to find it on Google, but my GoogleFu is obviously lackluster and I can't seem to find the problem or if these pieces of code is cardinal to the audioSource.Play.
So I commented that out again. The last thing that I tried to do tonight is as follows in the code:
var audio : AudioSource;
function Start()
{
audio = GetComponent.<AudioSource>();
}
function Update () {
if (Input.GetKeyDown("a"))
{
audio.Play();
Destroy(gameObject);
}
}
When I save the script with those changes I encounter the following error: BCE0004: Ambiguous reference 'audio': PickupA.audio, UnityEngine.Component.audio.
So I am at a wits end. If anyone of you out there can lend me a helping hand I would appreciate it immensely!
Answer by v01pe_ · Aug 25, 2016 at 08:19 PM
I'd say remove the line Destroy(gameObject);
and you're fine.
What you do is as soon as "A" is pressed you delete the object this script is on with all its components, including the AudioSource that can't continue playing.
If your intention was to remove the script that is starting the audio you would Destroy(this)
or set enabled = false
.
Also don't call the member variable for the AudioSource audio
because every component has this variable (historical reasons), but it's deprecated. Your first approach is also fine. As you don't do a lot with the AudioSource, you don't need to store it, you can GetComponent
it directly.
I've never done this in javascript, but the @RequireComponent(AudioSource)
should go right above the class declaration, but this only assures, that there has to be an AudioSource on the same object.
Hi V01pe_ Thank you so much! Removing the Destroy(gameObject) works like a charm for the sound effect, I didn't think that destroy would trigger before the sound does >.<.
I already have another idea on how to "remove" the object from play. I will also change the variable name to stay with current good practice, thank you for the heads up on that as well.
No problem! Technically the sound will start playing before the object is destroyed, but the playing sound is bound to the AudioSource and as soon as that is destroyed, also the sound stops playing. That means that it will also stop if you destroy the object e.g. 1 second later.
Follow this Question
Related Questions
Audio doesn't sound 0 Answers
audio is not playing during IEnumerator 1 Answer
How to reduce delay when playing sound 0 Answers
Playing multiple sounds at the same time? 1 Answer
Pick Up Sound 0 Answers