Загружаем...
год и 11 месяцев назад
Автоматическое переключение музыки с плавным переходом в Uni


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

Для этой задачи мы будем использовать две аудиодорожки (AudioSource), что позволит нам плавно переключаться между треками. В этом подходе используется кроссфейд — плавное уменьшение громкости текущего трека и одновременное увеличение громкости следующего.
Для этого создаём пустой GameObject, можно переименовать в AudioController к примеру, установить ниже указанный скрипт, а так же добавить два компонента AudioSource, это важно! Ниже представлен скриншот, как должен выглядеть в целом GameObject

using System.Collections;

using System.Collections.Generic;
using UnityEngine;

public class MusicManager : MonoBehaviour
{
public List<AudioClip> musicTracks; // Список музыкальных треков
public AudioSource audioSource1; // Первый аудиоисточник
public AudioSource audioSource2; // Второй аудиоисточник

private int currentTrackIndex = 0; // Индекс текущего трека
private bool isAudioSource1Playing = true; // Указывает, какой аудиоисточник активен

private void Start()
{
if (musicTracks.Count > 0)
{
PlayTrack(audioSource1, currentTrackIndex);
StartCoroutine(CheckAndCrossfade());
}
}

private void PlayTrack(AudioSource audioSource, int trackIndex)
{
audioSource.clip = musicTracks[trackIndex];
audioSource.Play();
audioSource.volume = 1f; // Начальная громкость
}

private IEnumerator CheckAndCrossfade()
{
while (true)
{
AudioSource activeSource = isAudioSource1Playing ? audioSource1 : audioSource2;
AudioSource inactiveSource = isAudioSource1Playing ? audioSource2 : audioSource1;

// Ждем, пока до конца текущего трека не останется 10 секунд
float timeUntilSwitch = activeSource.clip.length - activeSource.time - 10f;
if (timeUntilSwitch < 0) timeUntilSwitch = 0;
yield return new WaitForSeconds(timeUntilSwitch);

// Запускаем следующий трек на неактивном источнике
int nextTrackIndex = (currentTrackIndex + 1) % musicTracks.Count;
PlayTrack(inactiveSource, nextTrackIndex);

// Плавный переход между треками
StartCoroutine(CrossfadeTracks(activeSource, inactiveSource));

// Обновляем текущий индекс трека и переключаем активный источник
currentTrackIndex = nextTrackIndex;
isAudioSource1Playing = !isAudioSource1Playing;
}
}

private IEnumerator CrossfadeTracks(AudioSource fromSource, AudioSource toSource)
{
float duration = 5f; // Длительность плавного перехода
float elapsed = 0f;

while (elapsed < duration)
{
elapsed += Time.deltaTime;
float t = Mathf.Clamp01(elapsed / duration);
fromSource.volume = Mathf.Lerp(1f, 0f, t); // Уменьшаем громкость текущего источника
toSource.volume = Mathf.Lerp(0f, 1f, t); // Увеличиваем громкость следующего источника
yield return null;
}

fromSource.Stop(); // Останавливаем предыдущий трек после завершения перехода
}
}


Как это работает:
Два аудиоисточника: Используем два AudioSource, которые поочередно воспроизводят треки.
Смена трека: Когда до конца текущего трека остается 10 секунд, следующий трек начинается на неактивном источнике.
Плавный переход (кроссфейд): В течение 5 секунд громкость текущего трека уменьшается, а громкость следующего трека плавно увеличивается, обеспечивая незаметную смену музыки.
Это простой и эффективный способ сделать музыку в вашей игре более динамичной и приятной для восприятия.


Наверх