Редактор звуков кнопок для Unity

В процессе разработки игр на заказ я встречаюсь с примерно одним и тем же сценарием из проекта в проект. Заказчик пишет требования на механику игры, на различные окна и взаимодействия между ними. Я эти требования реализую, реализую, добавляю всё больше и больше окон. Окон становится ещё всё больше и больше, и элементов на этих окнах становится всё больше и больше. И в один прекрасный момент подвозят звуки.

В играх принято, что клик по каждой кнопке должен сопровождаться соответствующим звуком. Но кнопки в Unity UI об этом не знают. Компонент “Button” не имеет такого параметра как “Click Sound” или подобного. Приходится реализовывать самостоятельно.

game_menu

Реализовать звук клика не сложно, и есть много различных способов. Вот некоторые из них.

1.Плохой

Но который я встречаю очень часто, когда мне достаётся чужой код по наследству. Это создать статический метод “PlayClick” в каком-нибудь “SoundsManager”, реализовать его и в каждом обработчике события нажатия кнопки добавлять вызов этого метода.

public void ShowSettings()
{
  SoundsManager.PlayClick();
  ShowView(SettingsView);
}
---
public void HideTopPanel()
{
  SoundsManager.PlayClick();
  TopPanel.SetActive(false);
  BottomPanel.SetActive(true);
}

Надеюсь, что вам не нужно объяснять, почему так не стоит делать.

gekkon-nudavay_113566903_orig_

2. Хороший.

Тот же менеджер (SoundsManager) с тем же методом (PlayClick), но теперь метод не статический. А событию “OnClick” в редакторе назначаются два обработчика – первый вызывает метод, отвечающий за логику работы, а второй вызывает метод, проигрывающий звук нажатия на кнопку.

button_click_sound
Два обработчика события OnClick

Это решение на много лучше предыдущего, так как разделяет логику работы кнопок и проигрывания звуков по разным обработчикам событий и не захламляет код. Но имеет и свои недостатки.

Когда у нас в сцене несколько сотен кнопок, нужно будет все их найти, вручную добавить каждой обработчик, назначить объект-менеджер и выбрать метод проигрывания звука.

Может так получится, что самих звуков для кнопок будет немного больше, чем один. Тогда придется в “SoundsManager” добавлять новые методы “PlayClick2”, “PlayClick3” и для разных кнопок назначать свои методы. С таким подходом полностью теряется контроль. Перестаешь понимать какие кнопки какие звуки имеют. Нет возможности наглядно посмотреть эту информацию. А так же, легко может “отвалиться” один из обработчиков в случае рефакторинга методов в “SoundsManager”, и об этом не будет ни какого сообщения об ошибке.

Да, можно снова найти все кнопки на сцене, пройтись по ним и проверить всё вручную. Это не займет целой недели или целого дня. И даже часа не займет. И я бы так и делал, если бы задача была не типовая, единичная, не повторялась бы регулярно.

3.Мой.

Я же просто написал свой компонент “ButtonClickSound”. Он настолько простой, что можно весь код выложить ниже.

[RequireComponent(typeof(Button))]
public class ButtonClickSound : MonoBehaviour
{
  public AudioSource AudioSource;
  public AudioClip ClickSound;
 
  public void Awake()
  {
     GetComponent<Button>().onClick.AddListener(PlayClickSound);
  }
 
  private void PlayClickSound()
  {
     AudioSource.PlayOneShot(ClickSound);
  }
}

Компонент добавляется на любую кнопку, которой нужен звук при нажатии, назначаются два параметра: источник звука (AudioSource), который будет проигрывать звук, и сам клип звука (AudioClip).

buttonclicksound
ButtonClickSound добавляет любой кнопке звук нажатия.

Это решение более универсальное, так как разным кнопкам можно назначать разные звуки и даже при желании разные источники звуков (AudioSource). Но не решает проблему рутины, поиска кнопок в сцене и ручной работы с каждой из кнопок.

4. Редактор.

А вот с редактором всё на много удобнее. Unity позволяет писать функционал, расширяющий стандартный редактор, и оперировать с объектами в иерархии. Это даёт возможность запросить все кнопки на сцене и автоматически “навесить” им компонент и его параметры.

У меня есть такой редактор, и я использую его в каждом проекте. Написал его для себя. Позволяет быстро назначить каждой кнопке соответствующий звук. При необходимости можно посмотреть картинку кнопки или текст, а так же полный путь до кнопки в сцене для того, чтобы понять, что это за кнопка, не закрывая редактор.

Screen Shot 2016-07-23 at 23.58.13
Расширение редактора Unity

Редактор выложен в общественное пользование, так что пользуйтесь: Button Sounds Editor for Unity