You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.5 KiB
130 lines
4.5 KiB
using System; |
|
using System.Collections.Generic; |
|
using UnityEngine.Audio; |
|
using UnityEngine.Playables; |
|
|
|
namespace UnityEngine.Timeline |
|
{ |
|
/// <summary> |
|
/// A Timeline track that can play AudioClips. |
|
/// </summary> |
|
[Serializable] |
|
[TrackClipType(typeof(AudioPlayableAsset), false)] |
|
[TrackBindingType(typeof(AudioSource))] |
|
[ExcludeFromPreset] |
|
[TimelineHelpURL(typeof(AudioTrack))] |
|
public class AudioTrack : TrackAsset |
|
{ |
|
[SerializeField] |
|
AudioMixerProperties m_TrackProperties = new AudioMixerProperties(); |
|
|
|
#if UNITY_EDITOR |
|
Playable m_LiveMixerPlayable = Playable.Null; |
|
|
|
#endif |
|
|
|
/// <summary> |
|
/// Create an TimelineClip for playing an AudioClip on this track. |
|
/// </summary> |
|
/// <param name="clip">The audio clip to play</param> |
|
/// <returns>A TimelineClip with an AudioPlayableAsset asset.</returns> |
|
public TimelineClip CreateClip(AudioClip clip) |
|
{ |
|
if (clip == null) |
|
return null; |
|
|
|
var newClip = CreateDefaultClip(); |
|
|
|
var audioAsset = newClip.asset as AudioPlayableAsset; |
|
if (audioAsset != null) |
|
audioAsset.clip = clip; |
|
|
|
newClip.duration = clip.length; |
|
newClip.displayName = clip.name; |
|
|
|
return newClip; |
|
} |
|
|
|
internal override Playable CompileClips(PlayableGraph graph, GameObject go, IList<TimelineClip> timelineClips, IntervalTree<RuntimeElement> tree) |
|
{ |
|
var clipBlender = AudioMixerPlayable.Create(graph, timelineClips.Count); |
|
|
|
#if UNITY_EDITOR |
|
clipBlender.GetHandle().SetScriptInstance(m_TrackProperties.Clone()); |
|
m_LiveMixerPlayable = clipBlender; |
|
#else |
|
if (hasCurves) |
|
clipBlender.GetHandle().SetScriptInstance(m_TrackProperties.Clone()); |
|
#endif |
|
|
|
for (int i = 0; i < timelineClips.Count; i++) |
|
{ |
|
var c = timelineClips[i]; |
|
var asset = c.asset as PlayableAsset; |
|
if (asset == null) |
|
continue; |
|
|
|
var buffer = 0.1f; |
|
var audioAsset = c.asset as AudioPlayableAsset; |
|
if (audioAsset != null) |
|
buffer = audioAsset.bufferingTime; |
|
|
|
var source = asset.CreatePlayable(graph, go); |
|
if (!source.IsValid()) |
|
continue; |
|
|
|
if (source.IsPlayableOfType<AudioClipPlayable>()) |
|
{ |
|
// Enforce initial values on all clips |
|
var audioClipPlayable = (AudioClipPlayable)source; |
|
var audioClipProperties = audioClipPlayable.GetHandle().GetObject<AudioClipProperties>(); |
|
|
|
audioClipPlayable.SetVolume(Mathf.Clamp01(m_TrackProperties.volume * audioClipProperties.volume)); |
|
audioClipPlayable.SetStereoPan(Mathf.Clamp(m_TrackProperties.stereoPan, -1.0f, 1.0f)); |
|
audioClipPlayable.SetSpatialBlend(Mathf.Clamp01(m_TrackProperties.spatialBlend)); |
|
} |
|
|
|
tree.Add(new ScheduleRuntimeClip(c, source, clipBlender, buffer)); |
|
graph.Connect(source, 0, clipBlender, i); |
|
source.SetSpeed(c.timeScale); |
|
source.SetDuration(c.extrapolatedDuration); |
|
clipBlender.SetInputWeight(source, 1.0f); |
|
} |
|
|
|
ConfigureTrackAnimation(tree, go, clipBlender); |
|
|
|
return clipBlender; |
|
} |
|
|
|
/// <inheritdoc/> |
|
public override IEnumerable<PlayableBinding> outputs |
|
{ |
|
get { yield return AudioPlayableBinding.Create(name, this); } |
|
} |
|
|
|
#if UNITY_EDITOR |
|
internal void LiveLink() |
|
{ |
|
if (!m_LiveMixerPlayable.IsValid()) |
|
return; |
|
|
|
var audioMixerProperties = m_LiveMixerPlayable.GetHandle().GetObject<AudioMixerProperties>(); |
|
|
|
if (audioMixerProperties == null) |
|
return; |
|
|
|
audioMixerProperties.volume = m_TrackProperties.volume; |
|
audioMixerProperties.stereoPan = m_TrackProperties.stereoPan; |
|
audioMixerProperties.spatialBlend = m_TrackProperties.spatialBlend; |
|
} |
|
|
|
#endif |
|
|
|
void OnValidate() |
|
{ |
|
m_TrackProperties.volume = Mathf.Clamp01(m_TrackProperties.volume); |
|
m_TrackProperties.stereoPan = Mathf.Clamp(m_TrackProperties.stereoPan, -1.0f, 1.0f); |
|
m_TrackProperties.spatialBlend = Mathf.Clamp01(m_TrackProperties.spatialBlend); |
|
} |
|
} |
|
}
|
|
|