Добавление звуков ходьбы в Unity
Как известно, любое действие в игре сопровождается звуковыми эффектами. И звуки при движении игрока не исключение. В данной статье мы научимся добавлять звуки при ходьбе персонажа.
Мы не будем рассматривать реализацию самой ходьбы, а рассмотрим только воспроизведение звука ходьбы, в момент ходьбы. Но если по какой-либо причине Вы ещё не создали в своей игре движение игрока, то сначала предлагаем изучить гайд по реализации движения персонажа.
А теперь перейдём непосредственно к теме данной статьи. Для начала нам необходимо скачать звук ходьбы в интернете, и перетащить этот аудиофайл в окно Project. Так же можете переименовать данный файл на своё усмотрение. У меня он переименован в run.

Теперь для нашего персонажа создадим компонент Audio Source, который нужен для хранения и воспроизведения нашего аудиофайла шагов. После создания данного компонента, обратим своё внимание на три важных поля:

В поле AudioClip перетащите свой аудиофайл шагов из окна Project. В поле Play On Awake необходимо убрать галочку, чтобы наши шаги не воспроизводились сразу же, после запуска игры. Мы их сами будем воспроизводить в скрипте. А в поле Loop необходимо галочку всё же поставить, чтобы по завершению звукового файла, он воспроизводился снова и снова.
Остался последний штрих. Нам необходимо с помощью кода воспроизводить звук шагов, которые подгружены в компонент Audio Source в тот момент, когда персонаж идёт, и останавливать этот звук, когда персонаж не идёт. Для этого создадим новый скрипт C# с названием SoundRun, в котором пропишем следующее:
using UnityEngine; public class SoundRun : MonoBehaviour < public AudioSource moveSound; void Update() < if (Mathf.Abs(Input.GetAxis("Horizontal")) >0.35f && Mathf.Abs(Input.GetAxis("Vertical")) > 0.35f) < if (moveSound.isPlaying) return; moveSound.Play(); >else < moveSound.Stop(); >> >
В первой строке мы объявили переменную moveSound, в которой будет храниться ссылка на компонент AudioSource. Поэтому не забудьте в окне Inspector перетащить компонент Audio Source в поле moveSound.

В строке #9 мы проверяем, нажата ли кнопка движения игрока в одну из сторон: вправо, влево, вверх, вниз. И если да, то с помоью метода Play() воспроизводим наш аудиофайл шагов. А если кнопка движения не нажата, то принудительно останавливаем звук шагов с помощью метода Stop().
Так же обратите внимание, что в строке #11 у нас есть ещё одна проверка на то, воспроизводится ли звук шагов в данный момент? Если да, то ничего не делаем, поскольку так и надо. А если нет, то начинаем воспроизведение звука.
Важно: Чтобы не создавать множество скриптов, Вы можете скрипт SoundRun не создавать, а скопировать данный код в ваш скрипт, который отвечает за передвижение персонажа. Так будет более правильно.
Если после данной статьи, Вы захотели пойти дальше, и реализовать звук стрельбы, то это делается немного по другому, чем реализация звуков шагов. Спешу Вас обрадовать, это делается на много проще. О том, как добавить звук стрельбы в игру, мы писали в отдельной статье. Так что рекомендуем к прочтению.
На этом всё. Если остались вопросы, пишите в комментариях. А так же не забываем ставить алйки 🙂
Как сделать звуки шагов? [FPS]
Грамотное звуковое оформление в игре, может вытянуть всю атмосферу. Простенький менеджер звуков мы уже разбирали, ищите его где-то тут неподалеку. На этот раз затронем тему озвучки шагов персонажа. Проект ориентирован на игру от первого лица, когда ног персонажа не видно, то есть, звук не привязан к анимации. Впрочем, есть отдельный класс, который отвечает за воспроизведение звуков, поэтому при желании можно сделать привязку к анимации ног, что применимо и для двухмерной игрушки. В нашем же случаи, мы рассмотрим настройку интервала шагов в вручную. Кроме того, в комплекте идет и расширенный скрипт управления, так как он работает в связке со скриптом звуков.
Для работы нам понадобится условная моделька персонажа. Сделать ее достаточно просто. На пустой объект вешаем капсульный коллайдер, затем удочеряем камеру, поднимаем на уровень головы и всё.
Далее, в проекте должна быть папка Resources. В ней у нас будут хранится звуки. Мы будем использовать загрузку массивов на старте сцены, потому как в процессе разработки, звуки могут меняться, можем добавлять новые или же удалять ненужные. И чтобы каждый раз не мучится с ручным заполнением массива, лучше делать это через скрипт в таких случаях.
Создаем класс, который отвечает за загрузку и воспроизведение:
using UnityEngine; using System.Collections; [RequireComponent(typeof(AudioSource))] public class Footsteps : MonoBehaviour < public enum StepsOn ; // mainFolder - родительская папка в Resources // betonFolder и т.д. дочерние private string mainFolder = "Footsteps", betonFolder = "Beton", woodFolder = "Wood", metalFolder = "Metal", groundFolder = "Ground"; private AudioClip[] Beton, Wood, Metal, Ground; private AudioSource source; private AudioClip clip; void Start() < source = GetComponent(); source.playOnAwake = false; source.mute = false; source.loop = false; LoadSounds(); > void LoadSounds() < Beton = Resources.LoadAll(mainFolder + "/" + betonFolder); Wood = Resources.LoadAll(mainFolder + "/" + woodFolder); Metal = Resources.LoadAll(mainFolder + "/" + metalFolder); Ground = Resources.LoadAll(mainFolder + "/" + groundFolder); > public void PlayStep(StepsOn stepsOn, float volume) < switch(stepsOn) < case StepsOn.Beton: clip = Beton[Random.Range(0, Beton.Length)]; break; case StepsOn.Wood: clip = Wood[Random.Range(0, Wood.Length)]; break; case StepsOn.Metal: clip = Metal[Random.Range(0, Metal.Length)]; break; case StepsOn.Ground: clip = Ground[Random.Range(0, Ground.Length)]; break; >source.PlayOneShot(clip, volume); > >
Здесь есть меню, для выбора определенных звуков. Меню можно конечно расширить, если это нужно.
Создаем скрипт управления:
using UnityEngine; using System.Collections; [RequireComponent(typeof(Rigidbody))] [RequireComponent(typeof(Footsteps))] public class PlayerControl : MonoBehaviour < [Header("General")] public float speed = 1.5f; // скорость движения public float acceleration = 100f; // ускорение public float stepTimer = 0.8f; // интервал шагов во время ходьбы (секунды) [Header("Head / Camera")] public Transform head; public float sensitivity = 5f; // чувствительность мыши public float headMinY = -40f; // ограничение угла для головы public float headMaxY = 40f; [Header("Jump")] public KeyCode jumpButton = KeyCode.Space; // клавиша для прыжка public float jumpForce = 10; // сила прыжка public float jumpDistance = 1.2f; // расстояние от центра объекта, до поверхности [Header("Run")] public KeyCode runButton = KeyCode.LeftShift; // клавиша для бега public float addForce = 5; // добавить к скорости public float stepTimerRun = 0.35f; // интервал шагов во время бега (секунды) private Vector3 direction; private int layerMask; private Rigidbody body; private float rotY, curT, h, v, curSpeed, curStepTimer; private string tagName; private bool fall; private Footsteps foot; void Start () < foot = GetComponent(); body = GetComponent(); body.freezeRotation = true; layerMask = 1 void FixedUpdate() < body.AddForce(direction.normalized * curSpeed * acceleration * body.mass); // Ограничение скорости, иначе объект будет постоянно ускоряться if(Mathf.Abs(body.velocity.x) >curSpeed) < body.velocity = new Vector3(Mathf.Sign(body.velocity.x) * curSpeed, body.velocity.y, body.velocity.z); >if(Mathf.Abs(body.velocity.z) > curSpeed) < body.velocity = new Vector3(body.velocity.x, body.velocity.y, Mathf.Sign(body.velocity.z) * curSpeed); >> bool GetJump() // проверяем, есть ли коллайдер под ногами < RaycastHit hit; Ray ray = new Ray(transform.position, Vector3.down); if(Physics.Raycast(ray, out hit, jumpDistance, layerMask)) < tagName = hit.transform.tag; // берем тег поверхности return true; >tagName = string.Empty; return false; > void Update () < curSpeed = speed; curStepTimer = stepTimer; h = Input.GetAxis("Horizontal"); v = Input.GetAxis("Vertical"); // управление головой (камерой) float rotX = head.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivity; rotY += Input.GetAxis("Mouse Y") * sensitivity; rotY = Mathf.Clamp (rotY, headMinY, headMaxY); head.localEulerAngles = new Vector3(-rotY, rotX, 0); // вектор направления движения direction = new Vector3(h, 0, v); direction = head.TransformDirection(direction); direction = new Vector3(direction.x, 0, direction.z); Debug.DrawRay(transform.position, Vector3.down * jumpDistance, Color.red); // подсветка, для визуальной настройки jumpDistance if(Input.GetKey(runButton)) // если удерживать клавишу бега < curSpeed = speed + addForce; curStepTimer = stepTimerRun; >if(GetJump()) < if(Input.GetKeyDown(jumpButton)) < body.velocity = new Vector2(0, jumpForce); >Steps(); Falling(); > else < curT = 0; fall = true; >> void Falling() // падение на что-нибудь < if(fall) < fall = false; curT = 0; GetStep(); >> void Steps() < // округляем текущее значение скорости по оси X и Z, до сотых // чтобы исключить те, которые близкие к нулю, например: 0.000001805331f // в противном случаи, функция будет срабатывать, даже если персонаж не движется float velocityZ = RoundTo(Mathf.Abs(body.velocity.z), 100); float velocityX = RoundTo(Mathf.Abs(body.velocity.x), 100); if(velocityZ >0 && Mathf.Abs(v) > 0 || velocityX > 0 && Mathf.Abs(h) > 0) // если персонаж движется < curT += Time.deltaTime; if(curT >curStepTimer) < curT = 0; GetStep(); >> else < curT = 1000; >> void GetStep() // фильтр по тегу < switch(tagName) < case "GameController": foot.PlayStep(Footsteps.StepsOn.Beton, 1); break; case "Finish": foot.PlayStep(Footsteps.StepsOn.Ground, 1); break; >> float RoundTo(float f, int to) // округлить до, указанного значения < return ((int)(f*to))/(float)to; >>
Цепляем его на модельку, которую мы сделали ранее. Автоматически будут добавлены все необходимые компоненты. Не забываем указать камеру в качестве головы нашего персонажа, так как вращаться мышкой будет именно этот объект. И само собой, так как у нас фильтр по тегам, то значит если в игре, например, металлическая площадка, то и тег ей ставим соответствующий.
Звуки в юнити 2D
Проблема такова. у меня есть код для воспроизведения звука при нажатии A, D, W. |A — ходьба влево| |D — ходьба вправо| |W — прыжок| не обращайте внимания на названия. мне так удобно.
public class aydio : MonoBehaviour < public AudioClip kek1; public AudioClip kek2; private AudioSource audio; void Start() < audio = GetComponent(); > void Update() < if (Input.GetKeyDown(KeyCode.W)) audio.PlayOneShot(kek1); if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) audio.PlayOneShot(kek2); >>
Проблема в том что звуки ходьбы накладываются друг на друга, и я не знаю как чередовать например 4 звука шага в разном порядке. Как сделать случайное чередование звуков ходьбы, чтобы они не накладывались друг на друга и не останавливались пока не кнопку не отпустят. плиз, пишите простым языком.
Отслеживать
677 3 3 серебряных знака 20 20 бронзовых знаков
задан 10 дек 2020 в 18:00
Dark Lord Tehnology Dark Lord Tehnology
35 6 6 бронзовых знаков
было бы еще круто если еще сказали бы, как сделать настройку этого звука из игры . и чтобы это сохранялось
11 дек 2020 в 14:28
не обращайте внимания на названия. мне так удобно — kek1, kek2 — пишите простым языком — Ну-ну. То есть вы будете писать абы как, а вам должны писать понятно.
17 дек 2020 в 2:09
с чего вы взяли что я пишу абы как ? «пишите простым языком» я имел виду без сложных понятий, а на простом языке .
Не могу сделать звуки шагов
Не могу сделать звуки шагов через скрипт. Я хочу чтобы персонаж имел звуки ходьбы и они отличались от материала, по которому персонаж идет (у меня только дерево и ковер). Как это сделать? Уже уйму роликов и сайтов посетил, всё повторил, но ничего не работает — либо звук зациклен, либо объяснено очень плохо, что даже нет возможности понять куда нужно положить файлы со звуком, чтобы скрипт их нашёл. Помогите пожалуйста
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Разные звуки шагов по тиррейну. Возможно ли отследить текстуру под игроком ?
Разные звуки шагов по тиррейну. Возможно ли отследить текстуру под игроком? слои не подходят по.
Не слышу звуки шагов в играх
В играх ужасно плохо слышу шаги. Однако звук стрельбы громкий, даже очень. Если общую громкость.
Unity звуки шагов в BlendTree через ивенты плохо работают
Здравствуйте, столкнулся с проблемой, звуки шагов в моей игре сделаны через ивенты в анимации, все.
Проблема с наушниками — очень тихо воспроизводятся системные звуки и звуки в играх.
Такая проблема: системные звуки и звуки в играх и программах очень тихо воспроизводятся. Могу.
154 / 109 / 42
Регистрация: 28.05.2022
Сообщений: 752
зачем какие-то папки, файлы?
Добавлено через 1 минуту
создайте
public AudioClip НАЗВАНИЕ_КЛИПА
для каждого звука свой аудиоклип
проверяйте с чем столкнулись по тегу или названию и играйте нужный клип
Добавлено через 33 секунды
ну или отключать и включать audio source
Регистрация: 23.12.2022
Сообщений: 65
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
public class Footsteps : MonoBehaviour { public AudioClip[] myClip1; public AudioClup[] myClip2; void OnTriggerStay(Collider myCollider) { if (myCollider.tag == ("Wood")) { GetComponent Move>().m_FootstepSounds = myClip1; } } } void OnTriggerExit () { GetComponent Move>().m_FootstepSounds = myClip2; }
154 / 109 / 42
Регистрация: 28.05.2022
Сообщений: 752
я бы посоветовал использовать: CompareTag
а так все верно
Регистрация: 23.12.2022
Сообщений: 65
проблема только возникла
Assets\Footsteps.cs(26,5): error CS8803: Top-level statements must precede namespace and type declarations.
154 / 109 / 42
Регистрация: 28.05.2022
Сообщений: 752
а ну конечено.
var scriptMove = GetComponent ();
scriptMove.m_FootstepSounds = myClip1;
Добавлено через 1 минуту
чтобы много раз не писать var scriptmove
создайте публичнаю
public Move scriptMove;
в старте scriptMove = GetComponent ();
а потом просто обращяйтесь к нему
Добавлено через 3 минуты
скачайте visual studio code, и при установке добавьте пакеты для работы с юнити
в юнити Edit/preferences/External Tools и выберите вашу VS
все ошибки сразу будут подсвечены в редакторе кода + будут подсказки как и что делать.
Я очень часто пологаюсь на подсказки VS
Регистрация: 23.12.2022
Сообщений: 65
Мне как раз юнити и предложил скачать visual studio, видимо я случайно убрал одну из галочек когда устанавливал. Надо будет доустановить тогда
154 / 109 / 42
Регистрация: 28.05.2022
Сообщений: 752
сейчас сам поэксперементировал, я не смог получить ссылку на скрипт, но через gameobject получил ссылку на скрипт, не знаю с чем связано.
Регистрация: 23.12.2022
Сообщений: 65
А можно пример готового кода? Я пытаюсь где-то все-таки найти информацию и наткнулся на видео откуда я этот код и взял. Я всё видео пересмотрел, но он даже не осмелился показать где находятся звуки и как всё это работает.
Move — у меня это скрипт на движение персонажа и поворот камеры (через меню просто выбираешь камеру, на которую должен работать этот скрипт с поворотом камеры)
У меня есть 4 файла звуков для ходьбы по дереву и я хочу сделать чтобы они воспроизводились случайно при ходьбе.
У меня так же есть 4 файла звуков для ходьбы по ковру и я так же хотел бы чтобы они воспроизводились случайно при ходьбе.
Так же у меня есть две поверхности, ну то-есть два тега — Wood и Carpet.
Как мне это всё-таки сделать? Пытаюсь найти где-то объяснение или рабочий код, но не так всё просто!
154 / 109 / 42
Регистрация: 28.05.2022
Сообщений: 752

Сообщение было отмечено Aquander как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
public AudioClip myClip1; public AudioClip myClip2; public AudioClip DefaultClip; public GameObject Player; public Move scriptMove; public void Start() { scriptMove = Player.GetComponentMove>(); } void OnTriggerStay(Collider myCollider) { if (myCollider.CompareTag("Wood")) { scriptMove.m_FootstepSounds = myClip1; } if (myCollider.CompareTag("Iron")) { scriptMove.m_FootstepSounds = myClip2; } } void OnTriggerExit() { scriptMove.m_FootstepSounds = DefaultClip; }
я посмотрел было очень много неправильных вещей, я исправил
Добавлено через 2 минуты
незнаю, именно на форуме я немогу нормально проанализировать код, в vs все просто увидел.