В процессе разработки игр на заказ я встречаюсь с примерно одним и тем же сценарием из проекта в проект. Заказчик пишет требования на механику игры, на различные окна и взаимодействия между ними. Я эти требования реализую, реализую, добавляю всё больше и больше окон. Окон становится ещё всё больше и больше, и элементов на этих окнах становится всё больше и больше. И в один прекрасный момент подвозят звуки.
В играх принято, что клик по каждой кнопке должен сопровождаться соответствующим звуком. Но кнопки в Unity UI об этом не знают. Компонент “Button” не имеет такого параметра как “Click Sound” или подобного. Приходится реализовывать самостоятельно.
Реализовать звук клика не сложно, и есть много различных способов. Вот некоторые из них.
1.Плохой
Но который я встречаю очень часто, когда мне достаётся чужой код по наследству. Это создать статический метод “PlayClick” в каком-нибудь “SoundsManager”, реализовать его и в каждом обработчике события нажатия кнопки добавлять вызов этого метода.
public void ShowSettings() { SoundsManager.PlayClick(); ShowView(SettingsView); } --- public void HideTopPanel() { SoundsManager.PlayClick(); TopPanel.SetActive(false); BottomPanel.SetActive(true); }
Надеюсь, что вам не нужно объяснять, почему так не стоит делать.
2. Хороший.
Тот же менеджер (SoundsManager) с тем же методом (PlayClick), но теперь метод не статический. А событию “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).
Это решение более универсальное, так как разным кнопкам можно назначать разные звуки и даже при желании разные источники звуков (AudioSource). Но не решает проблему рутины, поиска кнопок в сцене и ручной работы с каждой из кнопок.
4. Редактор.
А вот с редактором всё на много удобнее. Unity позволяет писать функционал, расширяющий стандартный редактор, и оперировать с объектами в иерархии. Это даёт возможность запросить все кнопки на сцене и автоматически “навесить” им компонент и его параметры.
У меня есть такой редактор, и я использую его в каждом проекте. Написал его для себя. Позволяет быстро назначить каждой кнопке соответствующий звук. При необходимости можно посмотреть картинку кнопки или текст, а так же полный путь до кнопки в сцене для того, чтобы понять, что это за кнопка, не закрывая редактор.
Редактор выложен в общественное пользование, так что пользуйтесь: Button Sounds Editor for Unity