131 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | 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); | ||
|  |         } | ||
|  |     } | ||
|  | } |