Unity, создающая новые аудиоисточники для зацикливания песни в определенный момент времени, имеет паузу после первого циC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Unity, создающая новые аудиоисточники для зацикливания песни в определенный момент времени, имеет паузу после первого ци

Сообщение Anonymous »

У меня есть группа песен, которые я хочу иметь возможность зацикливать и плавно переключаться между ними. Для этого я создаю аудиоисточник для каждой песни, воспроизвожу их все одновременно и медленно меняю громкость каждой в зависимости от выбранной песни. Каждая песня «перезапускается» через 57,3 секунды, создавая новый аудиоисточник. Но поскольку в конце треков есть небольшие затухания, они немного длиннее 57,3 секунды. Чтобы решить эту проблему, я уменьшаю громкость исходных аудиоисточников до тех пор, пока они не исчезнут полностью.
Проблема, с которой я столкнулся, заключается в том, что в конце первого цикла песни заканчиваются немного раньше, чем они должны быть, вызывая паузу в музыке. Любой цикл после этого звучит правильно.

Код: Выделить всё

using Unity.VisualScripting;
using UnityEngine;

public class MusicManager : MonoBehaviour
{

[SerializeField] AudioClip[] music;
//timeToSwitchTracks is how long to wait before looping and is set to 57.3 seconds
[SerializeField] float timeToSwitchTracks;

AudioSource[] musicSources;
AudioSource[] lastMusicSources;
//selectedMusic determines which song should be audible and which ones should fade out
int selectedMusic = 0;
float timeSinceLastLoop = 0;

private void Awake() {

musicSources = new AudioSource[music.Length];
lastMusicSources = new AudioSource[music.Length];

if(timeToSwitchTracks  timeToSwitchTracks) {

createNewAudioSources();
//sets the volume of the newly created audiosource to match the old one
setMusicVolume(lastMusicSources[selectedMusic].volume);

}

}

void updateVolumes() {

int sign = 1;

for(int i = 0; i < musicSources.Length; i++) {

//add to the volume of the selected track, subtract from the volume of all others
sign = i == selectedMusic ? 1 : -1;

//increase or decrease the volume of each song based on if its the selected one or not
musicSources[i].volume = musicSources[i].volume + (Time.deltaTime * sign);
//music sources that are about to be deleted should slowly be muted
if (lastMusicSources[i] != null) {
lastMusicSources[i].volume = lastMusicSources[i].volume - Time.deltaTime;
}

}

}

//creates and starts playing new audiosources for each song
//and puts each precious audiosource into lastMusicSources to fade out slowly
void createNewAudioSources() {
timeSinceLastLoop = 0;

for (int i = 0; i < musicSources.Length; i++) {

//songs placed in this array are slowly muted before being destroyed
lastMusicSources[i] = musicSources[i];

musicSources[i] = transform.AddComponent();
musicSources[i].clip = music[i];
musicSources[i].volume = 0;

musicSources[i].Play();

//the length of each track varies a bit past 57.3 seconds but sound end by 65 seconds
Destroy(musicSources[i], 65f);

}

}

public void setSelectedMusic(int x) {
selectedMusic = x;
}

public void setMusicVolume(float volume) {
musicSources[selectedMusic].volume = volume;
}

}
Я думаю, проблема может быть связана с тем, что переменная timeSinceLastLoop не синхронизируется при первом запуске аудиоисточников. Я выходил из этой переменной каждый раз, когда песни зацикливались и время было правильным. Я не уверен, как я могу проверить, действительно ли аудиоисточники работают до того, как timeSinceLastLoop начнет отсчет, или как я могу это исправить, если это так.
У меня также возникла еще одна проблема при настройке Для playOnAwake значение true для каждого из аудиоисточников вместо использования метода play() внутри моего метода createNewAudioSource приведет к полному отсутствию воспроизведения звука. Может быть, это может быть связано с этим?

Подробнее здесь: https://stackoverflow.com/questions/790 ... se-after-t
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Python Discord Music Bot: воспроизведение следующей песни во время воспроизведения текущей песни
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Программа, создающая простой HTML-код, извлекающий файлы и структуры из папок.
    Гость » » в форуме Python
    0 Ответы
    53 Просмотры
    Последнее сообщение Гость
  • Как добиться зацикливания в механизме правил слюни?
    Anonymous » » в форуме JAVA
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Проблема с возвратом данных [false, false, false] после зацикливания обновленных данных в Phalcon
    Anonymous » » в форуме Php
    0 Ответы
    61 Просмотры
    Последнее сообщение Anonymous
  • Веб-форма Drupal, программно создающая составные компоненты
    Anonymous » » в форуме Php
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»