Search Unity

  1. Unity 2020.2 has been released.
    Dismiss Notice
  2. Good news ✨ We have more Unite Now videos available for you to watch on-demand! Come check them out and ask our experts any questions!
    Dismiss Notice

Clicksound for many buttons across several scenes

Discussion in 'Scripting' started by Jorhoto, Oct 23, 2019.

  1. Jorhoto


    May 7, 2019

    I am looking for a proper solution to let all the buttons in my application to emit different sounds (for the audio UI effects). I use like 10 scenes with one or more buttons each and I would need to play a sound (mostly click) after the OnClick event.

    A working method is to have a gameobject with an audiosource comp and call the appropiate function within each button, but, there isn't a better solution? I would like to get rid of:
    · The need of transitioning the gameobject accross all my scenes
    · Having to manually setup each button event call

    I tried scriptable objects, but they can't have attached the audiosource component.
    Any advice to solve this properly?

  2. Antistone


    Feb 22, 2014
    If you have a bunch of buttons with similar styling (images/fonts/sounds/animations) you should make a prefab for that button, so that when you want to change the style (e.g. adding a sound) you can just change the prefab and all the buttons will "inherit" the change.

    But if you've already made all the buttons without using a prefab, you're probably not going to get around changing every single button manually. (Though you should think about replacing them all with a prefab. That will be more work now, but might save work later on.)

    As for making a given button play a sound, if you are concerned about it being difficult to modify the onClick events by hand, one alternative is to create a new MonoBehaviour that sets up the sound callback automatically. In some projects (particularly when I discovered I needed to add sounds to a bunch of buttons that weren't prefabs), I've used a script like this:

    Code (CSharp):
    1. [RequireComponent(typeof(Button))]
    2. public class ButtonSound : MonoBehaviour
    3. {
    4.     void Start()
    5.     {
    6.         Button button = GetComponent<Button>();
    7.         button.onClick.AddListener(PlaySound);
    8.     }
    10.     void PlaySound()
    11.     {
    12.         // Do whatever you need to do to play the appropriate sound
    13.     }
    14. }
    If you can access the sound effect and audio source (or whatever wrappers you've written around them) somehow via singletons or a resource locator, then you can potentially code this component in such a way that it has no parameters and requires no setup at all--just attach the component to the button and you're done.

    (Of course, if you want different buttons to play different sounds, then you'll need to do a bit more work.)