bea2dce063
test
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
|
|
}
|
|
}
|