134 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine.Audio;
 | |
| #if UNITY_EDITOR
 | |
| using System.ComponentModel;
 | |
| #endif
 | |
| using UnityEngine.Playables;
 | |
| 
 | |
| namespace UnityEngine.Timeline
 | |
| {
 | |
|     /// <summary>
 | |
|     /// PlayableAsset wrapper for an AudioClip in Timeline.
 | |
|     /// </summary>
 | |
|     [Serializable]
 | |
| #if UNITY_EDITOR
 | |
|     [DisplayName("Audio Clip")]
 | |
| #endif
 | |
|     public class AudioPlayableAsset : PlayableAsset, ITimelineClipAsset
 | |
|     {
 | |
|         [SerializeField] AudioClip m_Clip;
 | |
| #pragma warning disable 649 //Field is never assigned to and will always have its default value
 | |
|         [SerializeField] bool m_Loop;
 | |
|         [SerializeField, HideInInspector] float m_bufferingTime = 0.1f;
 | |
|         [SerializeField] AudioClipProperties m_ClipProperties = new AudioClipProperties();
 | |
| 
 | |
|         // the amount of time to give the clip to load prior to it's start time
 | |
|         internal float bufferingTime
 | |
|         {
 | |
|             get { return m_bufferingTime; }
 | |
|             set { m_bufferingTime = value; }
 | |
|         }
 | |
| 
 | |
| #if UNITY_EDITOR
 | |
|         Playable m_LiveClipPlayable = Playable.Null;
 | |
| 
 | |
| #endif
 | |
| 
 | |
|         /// <summary>
 | |
|         /// The audio clip to be played
 | |
|         /// </summary>
 | |
|         public AudioClip clip
 | |
|         {
 | |
|             get { return m_Clip; }
 | |
|             set { m_Clip = value; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Whether the audio clip loops.
 | |
|         /// </summary>
 | |
|         /// <remarks>
 | |
|         /// Use this to loop the audio clip when the duration of the timeline clip exceeds that of the audio clip.
 | |
|         /// </remarks>
 | |
|         public bool loop
 | |
|         {
 | |
|             get { return m_Loop; }
 | |
|             set { m_Loop = value; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns the duration required to play the audio clip exactly once
 | |
|         /// </summary>
 | |
|         public override double duration
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (m_Clip == null)
 | |
|                     return base.duration;
 | |
| 
 | |
|                 // use this instead of length to avoid rounding precision errors,
 | |
|                 return (double)m_Clip.samples / m_Clip.frequency;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns a description of the PlayableOutputs that may be created for this asset.
 | |
|         /// </summary>
 | |
|         public override IEnumerable<PlayableBinding> outputs
 | |
|         {
 | |
|             get { yield return AudioPlayableBinding.Create(name, this); }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Creates the root of a Playable subgraph to play the audio clip.
 | |
|         /// </summary>
 | |
|         /// <param name="graph">PlayableGraph that will own the playable</param>
 | |
|         /// <param name="go">The GameObject that triggered the graph build</param>
 | |
|         /// <returns>The root playable of the subgraph</returns>
 | |
|         public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
 | |
|         {
 | |
|             if (m_Clip == null)
 | |
|                 return Playable.Null;
 | |
| 
 | |
|             var audioClipPlayable = AudioClipPlayable.Create(graph, m_Clip, m_Loop);
 | |
|             audioClipPlayable.GetHandle().SetScriptInstance(m_ClipProperties.Clone());
 | |
| 
 | |
| #if UNITY_EDITOR
 | |
|             m_LiveClipPlayable = audioClipPlayable;
 | |
| #endif
 | |
| 
 | |
|             return audioClipPlayable;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns the capabilities of TimelineClips that contain an AudioPlayableAsset
 | |
|         /// </summary>
 | |
|         public ClipCaps clipCaps
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return ClipCaps.ClipIn |
 | |
|                     ClipCaps.SpeedMultiplier |
 | |
|                     ClipCaps.Blending |
 | |
|                     (m_Loop ? ClipCaps.Looping : ClipCaps.None);
 | |
|             }
 | |
|         }
 | |
| 
 | |
| #if UNITY_EDITOR
 | |
|         internal void LiveLink()
 | |
|         {
 | |
|             if (!m_LiveClipPlayable.IsValid())
 | |
|                 return;
 | |
| 
 | |
|             var audioMixerProperties = m_LiveClipPlayable.GetHandle().GetObject<AudioClipProperties>();
 | |
| 
 | |
|             if (audioMixerProperties == null)
 | |
|                 return;
 | |
| 
 | |
|             audioMixerProperties.volume = m_ClipProperties.volume;
 | |
|         }
 | |
| 
 | |
| #endif
 | |
|     }
 | |
| }
 |