Как сделать звук при нажатии на кнопку unity

Добавил пользователь Morpheus
Обновлено: 04.10.2024

Данный урок описывает основные моменты создания лифта с кнопками управления. Причем расположить кнопки можно как в самом лифте так и за его пределами. В этом и была фишка урока.

Давно хотел описать принцип работы лифта в Unity3D вот решился на это событие. Итак для создания лифта запускаем Unity3d и создаем проект.

В новый проект лучше добавить элементы управления персонажем чтобы нам не отвлекаться на лишние действия. Для этого нажимаем кнопку Asset packages.

Ставим галку на против пакета Characters (игрок по русски), это добавит компоненты для управления игроком.

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

Ура Unity3D запустился и мы видим прекрасную сцену с одинокой камерой смотрящей в даль.

Для того чтобы наш будущий игрок мог ходить по полу его нужно создать. Итак добавим на сцену обычный куб который в дальнейшем станет полом для игрока. Для этого выберем пункт GameObject >> Cube

Кубик создастся размером по всем осям координат в единицу. Для какого то применения данный размер может и подойдет например для Minecraft но нам нужен пол.

Для изменения его размеров в инспекторе выставим размеры по ширине X и длине Z объекту например 100 на 100 и увидим как кубик превратился в импровизированный пол. Ура сцена есть.

Далее настроим камере управление чтобы мы могли двигаться по уровню и выполнять какие то действия. Для этого выделим камеру и добавим в ее компоненты систему управления. для этого выберем в меню следующий пункт.

Данный контроллер очень сложный скрипт позволяющий делать интересные эффекты с персонажем и отвечает он за перемещение, полеты, вращение головой и так далее. Нам достаточно будет того что наша камера будет просто двигаться. Поэтому найдем в параметрах пункт Walk Speed (скорость ходьбы) и выставим ее например в 1 чтобы камера смещалась при ходьбе с этой скоростью. Если будет стоять ноль то мы никуда не двинемся.

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

1) кнопки управления внутри лифта.

2) кнопка вызова лифта на этаже.

Первым делом делаем лифт и опишем его поведение.

Создаем платформу из кубика которая будет символический лифтом.

Чтобы лифт отличался и его можно было увидеть на полу. Создадим простой материал и далее присвоим его лифту.

1) Чтобы создать материал щелкаем мышкой в Assets Store и и выбираем

2) тащим материал прям на объект сцены который будем раскрашивать

3) в полученном материале настраиваем цвет как хочется. Главное чтобы наша площадка выделялась и была видна.

Итак теперь опишем поведение данной площадки лифта. Если подумать как работает мотор лифта то можно узнать что у лифта есть всего 3 состояния.

1) лифт стоит на месте

2) лифт едет вверх

3) лифт едет вниз

Далее скорость лифта не меняется и она при движении постоянна.

Итак объявим 2 переменные одна будет означать направление движения лифта по оси Y

1) если значение 1 то двигаемся вверх

2) если значение 0 то стоим на месте

3) если значение -1 то двигаться вниз

Вторая переменная будет скорость движения платформы ( лифта ).

Unity3D переменные для движения лифта

public class EngineLift : MonoBehaviour

SpeedMove = 0, //скорость движения лифта

VectorMove = 0; //направление движения

// Use this for initialization

// Update is called once per frame

Чтобы двигать лифт нужно менять координату Y в параметре Transform.position относительно переменной направления умножив ее на скорость и прошедшие секунды. Добавим данное действие в функцию Update()

Unity3D функция движения лифта

public class EngineLift : MonoBehaviour

SpeedMove = 0, //скорость движения лифта

VectorMove = 0; //направление движения

// Use this for initialization

// Update is called once per frame

//получим текущую позицию лифта

Vector3 P = this.transform.position;

//задаем движение относительно оси Y

P.y = P.y + SpeedMove * VectorMove * Time.deltaTime;

//меняем координаты лифта на новые

this.transform.position = P;

Далее сохраняем и тащим наш скрипт на платформу чтобы он начал на ней работать при запуске игры

Запускаем и прямо во время игры задаем скорость и направление для движения лифта вверх. Всегда обнулив параметр VectorMove мы сможем остановить лифт а если поставить его в -1 то мы его просто заставим опускаться вниз.

Итак наш мотор работает поднимает и опускает кабину лифта. Теперь займемся кнопками управления. Что делает кнопка. Она включается в момент вызова лифта и отключается в момент когда лифт достиг ее высоты. Таким образом у кнопки есть 2 состояния и один параметр.

1) лифт вызван (кнопка горит)

3) Параметр на какой высоте должен остановиться лифт чтобы отключить кнопку.

Далее лифт не может двигаться бесконечно вверх или вниз поэтому зададим ему ограничения по высоте. Для этого объявим две переменные Max_Y и Min_Y которые будут ограничивать движение нашего лифта вверх и в низ.

Текстовое поле

//ограничение

public float Max_Y=10, //Максимальная высота

Min_Y=1; //минимальная высота

SpeedMove = 0, //скорость движения лифта

VectorMove = 0; //направление движения

// Use this for initialization

// Update is called once per frame

//получим текущую позицию лифта

Vector3 P = this.transform.position;

//задаем движение относительно оси Y

P.y = P.y + SpeedMove * VectorMove * Time.deltaTime;

if (P.y > Min_Y) //проверяем максимальную высоту

Создаем 2 материал вызвав контекстное меню в окошке assets store и даем ему имя off

Выделим данный материал и назначим ему цвет например синий.

Отлично далее создадим новый файл скрипта в котором опишем поведение нашей кнопки. Назовем его ButtonKlick и опишем в нем смену состояния кнопки во время щелчка по ней. Опишем в коде массив материалов в котором будут храниться цвета кнопок.

Unity3D массив материалов.

public Material[] MatOnOff;

Далее повесим скрипт на кнопку и зададим параметры переменной которая будет хранить изображения состояния кнопки.

Добавим кнопке переменную которая будет означать в каком она состоянии находиться в текущий момент. Она будет логического типа:

если значение будет true (правда)

значит мы на нее нажали; если значение будет (false) ложь значит мы на нее не нажали.

Далее сменим материал во время смены состояния кнопки.

Unity3D переменная состояния кнопки

public Material[] MatOnOff;

//переменная обозначения нажатия кнопки

public bool ON=false; //по умолчанию отключена

void ChangeON()

//присваиваем переключателю обратный вид

void OnMouseDown()

// Use this for initialization

// Update is called once per frame

void Update ()

//получаем параметр материала

Renderer rend = GetComponent ();

//если материал загружен в скрипт

//меняем цвет материала в зависимости от того нажата кнопка или нет

Кнопка будет хранить в себе координату в какой точке она ждет лифт (по сути координаты этажа куда нужно попасть чтобы погасить кнопку). Потом мы будем эту координату использовать при определении куда нужно ехать лифту. Итак добавляем это значение (переменную) нашей кнопке.

Unity3D координаты этажа кнопки

public float VY = 0;

Теперь чтобы кнопки у нас были одинаковые создадим в Assets контейнер (prefab)

и разместим в нем нашу настроенную кнопку, просто перетащив его из окна Hitrarhy сферу в созданный префаб.

Итак теперь мы готовы описать логику вызова лифта на нужный нам этаж.

Теперь мы можем описать алгоритм движения лифта на указанную высоту проходя вызванные кнопки. Создаем скрипт MoveLift.

Для текущей задачи добавим в код одну кнопку и ссылку на платформу лифта которой будем управлять с помощью этой кнопки.

Текстовое поле

public GameObject ButtonLift;

//лифт которым будем управлять

public GameObject Lift;

По идее, данный код можно будет повесить на весь лифт, например на стену лифта или на его основную панель управления. Главное чтобы при старте игры он фигурировал в ней. Я повешу его на камеру. Но нужно понимать что это не принципиально где он будет расположен.

Итак попробуем описать сначала запуск движения лифта на основе первой самой нижней кнопки. Для этого в скрипт добавим 2 переменные. Первая переменная будет ссылка на кнопку лифта которая должна управлять платформой, вторая переменная будет ссылка на платформу.

Unity3D кнопка управления лифтом

public GameObject ButtonLift;

//лифт которым будем управлять

public GameObject Lift;

Следующим шагом опишем поведение лифта в виде функции MoveLifts

Текстовое поле

//получаем данные о кнопке

ButtonKlick S = ButtonLift.GetComponent ();

EngineLift Engine = Lift.GetComponent ();

//получаем значение кнопки

//если кнопка включена то получаем направление в какую сторону двигать лифт

//получаем текущее положение лифта

float PozaLift = Lift.transform.position.y;

//получаем направление лифта

float Direct = S.VY - PozaLift;

//округлим координату чтобы не париться с дробями и точными значениями

//значит направление вверх

Engine.VectorMove = 1; //задаем лифту направление вверх

if (Direct Итак запустим проект и посмотрим что получилось. Как видим задав кнопке значение высоты мы заставляем платформу ехать в направлении этого значения пока лифт не достигнет его. Как только лифт достиг желанной точки он останавливается и отключает кнопку.

Итак модифицируем нашу переменную которая является ссылкой на кнопку и сделаем из нее массив кнопок. Для этого изменим строку

Привет. В этот раз у нас кнопка (Button). Это первый элемент UI, который создан для непосредственного взаимодействия с пользователем, так что он и вправду очень важный. При этом кнопки ещё и довольно частый элемент в интерфейсе. Вы могли видеть в различных меню, инвентарях и других экранах.

Добавляем элемент Button

Я продолжу предыдущий проект, но просто перемещу Text и Image элементы, чтобы они нам не мешали. В следующий раз мы к ним вернемся.

Итак. Уже привычным способом добавляем на канвас кнопку:


В результате этого в центре экрана получаем новенькую кнопку:


Немного много лишнего, в другой раз таки оставлю сцену пустой…

Важной особенностью этого элемента в Unity является то, что текст внутри – это уже знакомый элемент Text. Его мы разбирали. Ещё круче то, что в Button можно положить, допустим, Image, получив кнопку с картинкой.

Инспектор кнопки содержит больше элементов, чем предыдущие, но среди них есть известные компоненты, вроде Rect Transform (положение, размер) и Image (спрайт кнопки).

Из предыдущих уроков мы узнали достаточно чтобы кастомизировать кнопку на свой вкус, например так:


И да, тень и обводка работают и с кнопками.

Компонент Button в Unity

Но разберем же и сам Button:


Чек-бокс Interactable определяет активна ли кнопка. Если флаг стоит, то на кнопку можно нажать, но если его снять, то нажатия больше не сработают (и она вообще ни на что реагировать не будет). Сама кнопка при этом тоже изменит цвет.


Сейчас она неактивна

Transition это переходы для отрисовки кнопки в разных состояниях. Может иметь три варианта: Color Tint, Sprite Swap и Animation.

Color Tint, это когда мы выбираем один спрайт для кнопки, но меняем лишь цвета. Т.е. цветовой переход, как сейчас. У нас есть цвета для нормального состояния, при наведении курсора, при нажатии, при выделении и для неактивного состояния.

Fade Duration это длительность перехода.


Курсор на кнопке*

Sprite Swap позволяет просто выбрать отдельные спрайты для этих же состояний:


Всё ещё на кнопке*

Animation один из самых интересных. Тут можно создать полноценный контроллер анимации и задать отдельные анимации для разных состояний.

Жмём Auto Generate Animation. И сохраняем в новую папку Animations. В результате вы должны получить такой вот файлик:


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


Добавим анимацию при наведении на кнопку мыши. Пускай… она будет ставать немного больше. Выделяем кнопку и открываем окошко анимации:


Выбираем Highlighted и добавляем переменную Scale:


Анимация будет такая: небольшое увеличение до 30 секунды, а после будет идти уменьшение до изначального размера.


Запускаем и проверяем:

Далее идёт Navigation. Он определяет, как можно будет перемещаться по элементам UI при помощи клавиатуры. None – запрещает управление, далее следуют Автоматический, Горизонтальный, Вертикальный, Явный (Explicit) – позволит самостоятельно определить направление. А Visualize ниже нужен, чтобы отобразить перемещение наглядно:


Вот как тут

Последний блок этого компонента это On Click (). Но для его реализации нужен скрипт, так что отложим это на другой раз.

А с кнопкой на этом всё 🙂 А в официальных обучающих ресурсах есть ещё обучающий материал по кнопкам.

What You'll Be Creating

В этой серии уроков мы покажем вам, как воссоздать классическую игру Arkanoid (или Breakout) в Unity, используя нативные 2D-инструменты этого движка. В каждой из статей мы затронем один из аспектов создания игры. В этой статье мы добавим звуки и музыку, создадим новые уровни и задеплоим игру для различных устройств.

На чем мы остановились

В прошлых частях мы настроили проект, запрограммировали поведение основных объектов, а также реализовали систему подсчета очков и жизней. Если вы не закончили предыдущий урок, мы настоятельно рекомендуем сделать это, прежде чем начинать этот.

Превью результата

Взгляните на это демо, чтобы увидеть, к чему мы стремимся во всей серии:

Звуки и музыка

В нашей первой статье серии мы импортировали в проект несколько звуковых файлов. Теперь пришло время их использовать. В папке Sounds есть три файла:

  • hit.wav : используется при каждом столкновении с мячиком.
  • lose.wav : используется, когда игрок теряет жизнь.
  • point.wav : используется, когда игрок получает очки.

Чтобы эти звуки проигрывались, нам нужно будет немножко изменить наши скрипты Player и Ball. Начнем с объекта Ball (мячик).

Первоначально нам нужно добавить аудио компонент к игровым объектам. Выберите мяч и добавьте Audio Source (Hierarchy > Inspector > Add Component). Обратите внимание, что вы должны снять флажок Play On Awake, если он установлен; иначе звук автоматически будет проигрываться при запуске сцены.




У вас есть аудио компонент; теперь вам нужно изменить скрипт для взаимодействия с самим компонентом. Создайте новую переменную для звукового файла. Поскольку вы хотите получить доступ к звуку в редакторе, переменная должна быть общедоступной public :

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

Обратите внимание на условие проверки активности мячика. Если мяч не будет в активном состоянии (а это значит, что он будет лежать на платформе), то без этого условия звук проигрывался бы всегда.

Теперь перейдите в редактор и убедитесь, что в компоненте Ball Script есть новый параметр Hit Sound.




Перетащите файл hit.wav со вкладки Project в поле Hit Sound. Вы должны увидеть что-то вроде этого:




А теперь давайте добавим два других звука в игру. Вставьте новый компонент Audio Source, но теперь уже на объект платформы. Снова снимите флажок с пункта Play On Awake.

Откройте скрипт PlayerScript и создайте две дополнительные переменные для звука. Первая переменная предназначена для воспроизведения звука, когда игрок набирает очки, а вторая отвечает за то, что игрок потерял одну жизнь. Обе они должны быть объявлены как public переменные.

Поскольку теперь у вас есть объекты, давайте модифицируем метод addPoints для воспроизведения звука каждый раз, когда он вызывается. Как и прежде, вы должны вызвать метод PlayOneShot из объекта audio :

Теперь сделайте то же самое в методе TakeLife :

Сохраните сценарий и перейдите еще раз в редактор. Перетащите в каждое из полей по звуковому файлу (point.wav и lose.wav). Вы должны увидеть что-то вроде того, что на скриншоте:




Запустите игру нажав кнопку Play и удостоверьтесь в том, что все три звуковых эффекта работают правильно.

Фоновая музыка

Несмотря на добавленные нами звуковые эффекты, возникает ощущение, что игра какая-то совершенно пустая. Давайте изменим это, добавив фоновую музыку, которая отличается для каждого уровня.

Во вкладке Hierarchy найдите объект Background и добавьте Audio Source:




Теперь перетащите файл Jaunty Gumption.mp3 из окна Project в поле Audio Clip компонента Audio Source. На этот раз вы должны оставить параметр Play On Awake включенным, так как мы хотим, чтобы музыка начала воспроизводиться при загрузке нашего уровня. Также включите параметр Loop, который позволит музыке начаться заново, если она закончится.

Действуйте и запустите игру нажав Play и проверьте работу фоновой музыки. Теперь в вашей игре есть звук и музыка.

Уровни

Чтобы закончить игру, мы решим две вещи:

  • Когда игрок уничтожает все блоки, он должен перейти на следующий уровень.
  • Когда игрок теряет все свои жизни, игра должна перезапуститься.

Начнем с создания второго уровня для игры. Вместо того, чтобы создавать уровень с нуля, мы можем просто дублировать первый уровень и изменить объекты этого нового уровня.

Для этого вам просто нужно сохранить вашу сцену как новую. Нажмите File > Save Scene as. , назовите этот уровень Level2 и поместите его в папку Levels.

Чтобы этот уровень отличался от первого, в идеале следует изменить расположение всех блоков. Здесь все ограничивается вашей фантазией, но мы поменяем лишь фоновое изображение и музыку.

Выберите объект Background в окне Hierarchy и посмотрите на вкладку Inspector. Перетащите файл Background2 из папки Sprites\Backgrounds в поле Sprite игрового объекта Background:




Для изменения фоновой музыки вам нужно перетащить нужный музыкальный файл в параметр Audio Clip. Для второго уровня Level 2 используйте файл Monkeys Spinning Monkeys.mp3.

Если вы нажмете кнопку Play, вы можете протестировать этот новый уровень. Как вы можете видеть, он работает точно так же, как и первый, но с другим фоном и другой музыкой. Поскольку второй уровень готов, настало время разобраться с двумя описанными ранее ситуациями.

Откройте скрипт платформы и создайте новый метод WinLose . Здесь мы будем проверять, потерял ли игрок все свои жизни: если переменная playerLives будет равна 0 , мы попросту вызовем метод Application.LoadLevel и перезапустим первый уровень.

Далее нам следует проработать момент, когда все блоки на сцене будут уничтожены. Чтобы определить количество оставшихся блоков, мы снова можем использовать метод FindGameObjectsWithTag , на этот раз ищем объекты на текущем уровне с тегом Block. Если полученный массив имеет длину 0 , то мы знаем, что пришло время загрузить следующий уровень.

Поскольку в этом руководстве у нас всего лишь два уровня, то если игрок выиграет второй уровень, мы просто закроем игру (вызвав Application.Quit ).

Полный фрагмент кода метода WinLose :

В скрипте PlayerScript мы будем вызывать метод WinLose в методе Update - просто добавьте его в конец метода. Для простоты, завершенный метод Update :



Теперь игра готова к тестированию. Нажмите Play и попробуйте!

Компиляция и развертывание проекта

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

Во-первых, вам нужно добавить все сцены в сборку. Нажмите File > Build Settings. Появится новое окно, где, скорее всего, Scenes In Build будет пустым, как здесь:




Если это так, вам нужно добавить сцены, которые мы создали ранее. Нажмите Add Current, и сцена будет добавлена ​​в область Scenes In Build:




В нашем примере мы добавили первый уровень. Закройте это окно и откройте в редакторе второй уровень. Нажмите снова File > Build Settings и нажмите еще раз Add Current:




Если вы добавили второй уровень до первого, не волнуйтесь: просто поменяйте их местами при помощи мыши (так как первая сцена в этом списке - это та, которая будет загружена при запуске игры).

После того, как оба уровня добавлены в правильном порядке, нажмите на кнопку Build and Run, и вы должны увидеть окончательную версию вашей игры.

Как вы могли заметить, Unity поддерживает множество платформ, которые вы можете выбрать для развертывания своей игры, а именно:

  • Веб-браузеры
  • ПК, Mac и Linux
  • Мобильные операционные системы: iOS, Android, Blackberry и Windows Phone 8
  • Google Native Client
  • Консоли: Xbox 360, PS3 и Wii
  • Windows Store

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

Однако следует отметить, что некоторые платформы и операционные системы имеют определенные ограничения в отношении правил развертывания. Например, вы не сможете установить ваше приложение на iOS, если у вас нет компьютера на Mac OS и лицензии разработчика. Вам также нужны лицензии для развертывания игры на PS3 и Xbox.

Задачи

Теперь, когда вы закончили это руководство мы думаем вы готовы для того, чтобы решить определенные задачи. Вы можете рассмотреть эти задачи как определенный способ освоения новых знаний.

  1. Добавьте еще больше различных стилей и конфигураций для блоков: таких, которые бы различались количеством ударов, от которых они ломаются, и очков, которые зарабатывает игрок при уничтожении блока.
  2. Создайте оригинальный уровень: третий уровень, который полностью отличается от двух других уровней. Вы можете использовать другой фон, другую музыку и другое расположение блоков. Мы хотели бы видеть скриншоты в разделе комментариев!
  3. Реализуйте многопользовательский режим с использованием той же клавиатуры: добавьте необходимую логику для обработки ввода с других клавиш клавиатуры и добавьте в интерфейс игры очки и жизни второго игрока.

Вывод

Это завершает эту серию руководств по разработке игры Arkanoid с использованием 2D-инструментария Unity. В этой короткой серии мы рассмотрели много вопросов, теперь вы знаете достаточно, чтобы начать разрабатывать свои собственные 2D игры на Unity. Если у вас есть какие-либо вопросы или отзывы, как всегда, не стесняйтесь писать в разделе для комментариев.

Воспроизведение непрерывной музыки при переключении между несколькими сценами в Unity3d

31 - Воспроизведение звука через несколько сцен / фона в Unity3d

У меня следующий сценарий

  1. Сцена главного меню, содержащая игровой объект с компонентом источника звука
  2. Сцена о нас



Когда я нажимаю кнопку aboutUs, Game Music object продолжайте играть, и я слышу музыку, но когда я возвращаюсь в главное меню, музыка все еще не воспроизводится. Я вижу, что игровой объект не уничтожается, когда я возвращаюсь в главное меню, а для аудиослушателя установлено значение громкости. 1 , но я не могу понять, в чем проблема, может ли кто-нибудь мне помочь

Для этого вам нужен синглтон. В Unity Patterns есть отличный пост об использовании синглтона в среде Unity3D. Попробуйте реализовать это Постоянный синглтон шаблон, указанный на сайте.

Иногда вам нужно, чтобы ваши синглтоны длились между сценами (например, в этом случае вы можете включить музыку во время перехода между сценами). Один из способов сделать это - вызвать DontDestroyOnLoad () на вашем синглтоне.

Читайте также: