Объявление
public void PlayScheduled(double time);Параметры
time | Время в секундах на абсолютной временной шкале, на которую ссылается AudioSettings.dspTime, когда звук должен начать воспроизводиться.. |
Описание
Воспроизведение клипа в определенное время на абсолютной временной шкале, из которой считывается AudioSettings.dspTime.
Это предпочтительный способ объединения аудиоклипов в музыкальных проигрывателях, поскольку он не зависит от частоты кадров и дает аудиосистеме достаточно времени для подготовки воспроизведения звука к извлечению его с носителя, где открытие и буферизация занимают много времени. время (потоки), не вызывая внезапных пиковых нагрузок на ЦП.
using UnityEngine;
using System.Collections;
// Базовая демонстрация музыкальной системы, использующей PlayScheduled для предварительной загрузки и точного сэмплирования
// сшиваем два аудиоклипа попеременно. Код предполагает, что музыкальные произведения
// каждые 16 тактов (4 такта/такт) в темпе 140 ударов в минуту.
// Чтобы он сшивал произвольные клипы, просто замените строку
// nextEventTime += (60.0 / ударов в минуту) * numBeatsPerSegment
// к
// nextEventTime += clips[flip].length;
[RequireComponent(typeof(AudioSource))]
public class ExampleClass : MonoBehaviour
{
public float bpm = 140.0f;
public int numBeatsPerSegment = 16;
public AudioClip[] clips = new AudioClip[2];
private double nextEventTime;
private int flip = 0;
private AudioSource[] audioSources = new AudioSource[2];
private bool running = false;
void Start()
{
for (int i = 0; i < 2; i++)
{
GameObject child = new GameObject("Player");
child.transform.parent = gameObject.transform;
audioSources[i] = child.AddComponent<AudioSource>();
}
nextEventTime = AudioSettings.dspTime + 2.0f;
running = true;
}
void Update()
{
if (!running)
{
return;
}
double time = AudioSettings.dspTime;
if (time + 1.0f > nextEventTime)
{
// Сейчас мы прибл. за 1 секунду до времени, в которое должен воспроизводиться звук,
// поэтому мы запланируем это сейчас, чтобы у системы было достаточно времени
// для подготовки воспроизведения в указанное время. Это может включать в себя открытие
// буферизует потоковый файл и, следовательно, должен учитывать любую наихудшую задержку.
audioSources[flip].clip = clips[flip];
audioSources[flip].PlayScheduled(nextEventTime);
Debug.Log("Scheduled source " + flip + " to start at time " + nextEventTime);
// Place the next event 16 beats from here at a rate of 140 beats per minute
nextEventTime += 60.0f / bpm * numBeatsPerSegment;
// Flip between two audio sources so that the loading process of one does not interfere with the one that's playing out
flip = 1 - flip;
}
}
}
Пример AudioSource.SetScheduledEndTime показывает, как можно воспроизвести два аудиоклипа без хлопков и щелчков между ними. Подход состоит в том, чтобы иметь два AudioSource с прикрепленными клипами и ставить каждый клип в очередь, используя свой AudioSource.
Смотрите так же: SetScheduledStartTime.