Ученики нашей школы часто спрашивали, как добавить систему звуков, как работать со звуками и т.д. Поэтому мы решили подготовить краткий но понятный материал по этой теме.
В FPSController’е уже встроен звук шагов, прыжка и приземления. Тем не менее, в реальной ситуации, эту систему приходится переделывать. Например, для сетевой игры, чтобы точно синхронизировать звук шагов, или, если хочется добавить какой-либо функционал, например, разный звук при ходьбе по разным материалам. В этой статье мы покажем вам, как отключить стандартную систему звука, а затем, как сделать простой вариант системы звуков, с одним звуковым файлом для шагов.
Подготовка сцены
Для начала нужно подготовить сцену.
- FPSController
Скачиваем с Asset Store. Открываем окно Asset Store’а.
Вбиваем в поиск «Standart Assets».
Кликаем «Download», ждем пока скачается, потом кликаем «Import».
Возможно будут ошибки импорта, т.к. Standart Assets обновляется каждый раз при выходе новой версии.
Не боимся, просто очищаем консоль.
Чтобы очистить консоль:
– Кликаем снизу на текст ошибки
– В открывшемся окне кликаем на «Clear»
- Создаем
Меняем масштаб X и Z 100х100
- Делаем материал для «земли»
Это не обязательно, когда «земля» белая, немного засвечивает экран, не очень приятно.
Чтобы создать и присвоить материал:
- Правый клик на Assets
- Create -> Material
- Выбираем его и перетаскиваем на «землю»
- Меняем настройки цвета, как нравится
Мы сделали цвет чуть потемнее
- Находим в Assets\Standard Assets\Characters\FirstPersonCharacter\Prefabs префаб (обозначется синеньким кубиком) FPSController и перетаскиваем его на сцену.
Двигаем его чуть выше земли, чтобы не провалился при запуске игры.
- Ставим кубик, чтобы ходить вокруг него
- Удаляем Main Camera, которая есть по стандарту на сцене
- Пробуем
- Отключаем Use FOV Kick и Use Blob Head в FirstPersonCharacter, но это не обязательно
- Чтобы убрать звуки шагов: В Скрипте FirstPersonController.cs с помощью символов «//»
- Комментируем строку 74
- Комментируем строку 119
- Комментируем строку 130
Пример закоменченной строки:
Система звуков отключена, всё готово, чтобы делать свою систему.
Подготовка скрипта
- Качаем звуки, можно с сайта premiumbeat.com/blog/40-free-footstep-foley-sound-effects/
- Создаем папку Sounds в Assets
- Распаковываем архив в папку Sounds
Импорт займет много времени – звуковые файлы гарантированно долго конвертируются.
- Создаем папку Scripts
- Создаем скрипт FootstepsSoundController
- Добавляем скрипт cs на FPSController на сцене
- Когда объявили переменные – не забудьте добавить аудиоклипы через инспектор:
Звук прыжка и приземления берем из стандартных ассетов, в папке FirstPersonCharacter
Звук ходьбы берем на ваше усмотрение из заранее заготовленных, из папки Sounds. Мы выбрали Concrete_Shoes_Running.
Должно получится так:
Скриптинг
Обратите внимание на комментарии в коде. Больше инфы после листинга кода.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FootstepsSoundController : MonoBehaviour
{
public AudioClip FootstepsSound;
public AudioClip JumpSound;
public AudioClip LandingSound;
private AudioSource audioSource;
private CharacterController cController;
private bool wasGrounded = false;
void Start()
{
//getcomponent очень требователен к ресурсам компьютера, поэтому мы выполняем его один раз, “сохраняем ссылки” на компоненты
audioSource = GetComponent<AudioSource>();
cController = GetComponent<CharacterController>();
}
void FixedUpdate()
{
if (cController.isGrounded) //персонаж на земле
{
if (cController.velocity.sqrMagnitude > 0f) //персонаж двигается, используется квадратичная магнитуда,
//т.к. это операция менее требовательна к ресурсам, и нам не нужна точная скорость – нам нужен сам факт передвижения
{
if (!audioSource.isPlaying) { //проигрываем новый звук, только если сейчас никакой звук не играет
audioSource.clip = FootstepsSound;
audioSource.Play();
}
}
else //персонаж НЕ двигается
{
if (audioSource.clip != JumpSound && audioSource.clip != LandingSound) //если аудиоклип в AudioSorce это не клип прыжка и не клип приземление
if (audioSource.isPlaying) //если звук проигрывается
audioSource.Stop(); //выключаем проигрывание звуков
}
if (cController.isGrounded != wasGrounded) //проигрываем звук, если раньше персонаж был на земле, а теперь в воздухе
{
audioSource.Stop();
audioSource.clip = LandingSound;
audioSource.Play();
}
wasGrounded = true; //запоминаем прошлое состояние персонажа – в данном случае персонаж на земле
}
else //персонаж НE на земле
{
if (audioSource.clip != JumpSound && audioSource.clip != LandingSound) //если аудиоклип в AudioSorce это не клип прыжка и не клип приземление
{
if (audioSource.isPlaying) //если звук проигрывается
{
audioSource.Stop(); //выключаем проигрывание звуков
}
}
if (cController.isGrounded != wasGrounded) //проигрываем звук, если раньше персонаж был в воздухе, а теперь на земле
{
audioSource.Stop();
audioSource.clip = JumpSound;
audioSource.Play();
}
wasGrounded = false; //запоминаем прошлое состояние персонажа – в данном случае персонаж в воздухе
}
}
}
Подробнее
- Зачем вообще нужен GetComponent?
На сцене может существовать сколько угодно AudioSource и CharacterController. С помощью GetComponent мы указываем какой именно компонент мы используем.
- Почему GetComponent в старте? почему логика в FixedUpdate, а не в Update?
- Функция GetComponent очень требовательна к ресурсам. Мы выполняем её только один раз при запуске скрипта и сохраняем результат её работы в виде ссылки на компонент. Дальше мы можем использовать ссылку на компонент на свое усмотрение, без повторного использования GetComponent.
- Звук может проигрываться в любой момент, и, вроде логично было бы выполнять функцию в Update. Но на деле обновление положения физических объектов (в т.ч. CharacterController’а) происходит каждый FixedUpdate. То есть, если выполнять логику скрипта в Update, то, на деле, мы просто сильнее загрузим компьютер, а результат будет точно такой же.
- Как обращаться с AudioSource и AudioClip?
- Чтобы добавить ваш аудиоклип в скрипт создаем переменную тип AudioClip.
- В AudioSource, переменную clip, присваиваем ваш аудиоклип
- Чтобы начать проигрывание звук – используем команду Play(), чтобы остановить проигрывания звука – используем команду Stop().
Пример:
audioSource = GetComponent<AudioSource>();
audioSource.Stop();
audioSource.clip = LandingSound;
audioSource.Play();
4. Условия выполнения логики скрипта
- Если персонаж на земле И двигается – включаем звук шагов
- Если персонаж в воздухе ИЛИ НЕ двигается – выключаем звук шагов
- Если персонаж был в воздухе, а потом оказался на земле – проигрываем звук приземления
- Если персонаж был на земле, а потом оказался в воздухе – проигрываем звук прыжка
5. Магнитуда вектора – это длина вектора. Зачем? Скорость это трехкомпонентный вектор (X,Y,Z). Его длинна – скорость в метрах/секунду. В нашем случае нам просто нужно узнать двигается ли персонаж, т.е. если магнитуда вектора скорости больше нуля – то персонаж двигается.
Заключение
Многие разработчики недооценивают важность звука в видеоиграх. Так же, системы звука всегда очень сложные, требуют много работы не только с кодом, но и с звуковыми файлами.
Но, на деле, именно правильное звуковое сопровождение создает эффект «присутствия» и «погружения» в игру, а это, как известно, очень важно.
Удачи!
спасибо. А теперь вопрос. Отключились шаги(не могу ходить) после паузы строк 74 119 130
Проконсультируйтесь пожалуйста через my.first.unity.help@gmail.com
Крута а как дабавить озвучку персанажа чтоб он разгаваривал в нужный мамент в нужное время
Рекомендуем видео: https://www.youtube.com/watch?v=1gwXwag1qw8&t=17s