chrisgregan
10 years ago
4 changed files with 327 additions and 0 deletions
@ -0,0 +1,60 @@ |
|||||||
|
using UnityEditor; |
||||||
|
using UnityEditorInternal; |
||||||
|
using UnityEngine; |
||||||
|
using UnityEngine.UI; |
||||||
|
using UnityEngine.Events; |
||||||
|
using System; |
||||||
|
using System.Collections; |
||||||
|
using System.Collections.Generic; |
||||||
|
using Rotorz.ReorderableList; |
||||||
|
|
||||||
|
|
||||||
|
namespace Fungus |
||||||
|
{ |
||||||
|
|
||||||
|
[CustomEditor (typeof(ControlAudio))] |
||||||
|
public class ControlAudioEditor : CommandEditor |
||||||
|
{ |
||||||
|
protected SerializedProperty controlProp; |
||||||
|
protected SerializedProperty audioSourceProp; |
||||||
|
protected SerializedProperty startVolumeProp; |
||||||
|
protected SerializedProperty endVolumeProp; |
||||||
|
protected SerializedProperty fadeDurationProp; |
||||||
|
protected SerializedProperty waitUntilFinishedProp; |
||||||
|
|
||||||
|
protected virtual void OnEnable() |
||||||
|
{ |
||||||
|
controlProp = serializedObject.FindProperty("control"); |
||||||
|
audioSourceProp = serializedObject.FindProperty("audioSource"); |
||||||
|
startVolumeProp = serializedObject.FindProperty("startVolume"); |
||||||
|
endVolumeProp = serializedObject.FindProperty("endVolume"); |
||||||
|
fadeDurationProp = serializedObject.FindProperty("fadeDuration"); |
||||||
|
waitUntilFinishedProp = serializedObject.FindProperty("waitUntilFinished"); |
||||||
|
} |
||||||
|
|
||||||
|
public override void DrawCommandGUI() |
||||||
|
{ |
||||||
|
serializedObject.Update(); |
||||||
|
|
||||||
|
ControlAudio t = target as ControlAudio; |
||||||
|
|
||||||
|
EditorGUILayout.PropertyField(controlProp); |
||||||
|
EditorGUILayout.PropertyField(audioSourceProp); |
||||||
|
string fadeLabel = "Fade Out Duration"; |
||||||
|
if (t.control != ControlAudio.controlType.StopLoop && t.control != ControlAudio.controlType.PauseLoop) |
||||||
|
{ |
||||||
|
fadeLabel = "Fade In Duration"; |
||||||
|
string volumeLabel = "End Volume"; |
||||||
|
if (t.control == ControlAudio.controlType.ChangeVolume) |
||||||
|
{ |
||||||
|
fadeLabel = "Fade Duration"; |
||||||
|
volumeLabel = "New Volume"; |
||||||
|
} |
||||||
|
EditorGUILayout.PropertyField(endVolumeProp,new GUIContent(volumeLabel)); |
||||||
|
} |
||||||
|
EditorGUILayout.PropertyField(fadeDurationProp,new GUIContent(fadeLabel)); |
||||||
|
EditorGUILayout.PropertyField(waitUntilFinishedProp); |
||||||
|
serializedObject.ApplyModifiedProperties(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: 5d1c9ed42e441784684b7d550738d944 |
||||||
|
MonoImporter: |
||||||
|
serializedVersion: 2 |
||||||
|
defaultReferences: [] |
||||||
|
executionOrder: 0 |
||||||
|
icon: {instanceID: 0} |
||||||
|
userData: |
@ -0,0 +1,251 @@ |
|||||||
|
using UnityEngine; |
||||||
|
using System.Collections; |
||||||
|
|
||||||
|
namespace Fungus |
||||||
|
{ |
||||||
|
[CommandInfo("Audio", |
||||||
|
"Control Audio", |
||||||
|
"Plays, loops, or stops an audiosource.")] |
||||||
|
public class ControlAudio : Command |
||||||
|
{ |
||||||
|
public enum controlType |
||||||
|
{ |
||||||
|
PlayOnce, |
||||||
|
PlayLoop, |
||||||
|
PauseLoop, |
||||||
|
StopLoop, |
||||||
|
ChangeVolume |
||||||
|
} |
||||||
|
[Tooltip("What to do to audio")] |
||||||
|
public controlType control; |
||||||
|
|
||||||
|
[Tooltip("Audio clip to play")] |
||||||
|
public AudioSource audioSource; |
||||||
|
|
||||||
|
[Range(0,1)] |
||||||
|
[Tooltip("Start audio at this volume")] |
||||||
|
public float startVolume = 1; |
||||||
|
|
||||||
|
[Range(0,1)] |
||||||
|
[Tooltip("End audio at this volume")] |
||||||
|
public float endVolume = 1; |
||||||
|
|
||||||
|
[Tooltip("Time to fade between current volume level and target volume level.")] |
||||||
|
public float fadeDuration; |
||||||
|
|
||||||
|
public bool waitUntilFinished = false; |
||||||
|
|
||||||
|
public override void OnEnter() |
||||||
|
{ |
||||||
|
if (audioSource == null) |
||||||
|
{ |
||||||
|
Continue(); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
audioSource.volume = endVolume; |
||||||
|
switch(control) |
||||||
|
{ |
||||||
|
case controlType.PlayOnce: |
||||||
|
StopAudio(); |
||||||
|
PlayOnce(); |
||||||
|
break; |
||||||
|
case controlType.PlayLoop: |
||||||
|
StopAudio(); |
||||||
|
PlayLoop(); |
||||||
|
break; |
||||||
|
case controlType.PauseLoop: |
||||||
|
PauseLoop(); |
||||||
|
break; |
||||||
|
case controlType.StopLoop: |
||||||
|
StopLoop(); |
||||||
|
break; |
||||||
|
case controlType.ChangeVolume: |
||||||
|
ChangeVolume(); |
||||||
|
break; |
||||||
|
} |
||||||
|
if (!waitUntilFinished) |
||||||
|
{ |
||||||
|
Continue(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected void StopAudio() |
||||||
|
{ |
||||||
|
if (audioSource == null) |
||||||
|
{ |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
StopLoop(); |
||||||
|
} |
||||||
|
|
||||||
|
protected void PlayOnce() |
||||||
|
{ |
||||||
|
if (fadeDuration > 0) |
||||||
|
{ |
||||||
|
audioSource.volume = 0; |
||||||
|
PlaySoundWithCallback(audioSource.audio.clip, endVolume, AudioFinished); |
||||||
|
LeanTween.value(audioSource.gameObject,0,endVolume,fadeDuration |
||||||
|
).setOnUpdate( |
||||||
|
(float updateVolume)=>{ |
||||||
|
audioSource.volume = updateVolume; |
||||||
|
} |
||||||
|
).setOnComplete( |
||||||
|
()=>{ |
||||||
|
if (waitUntilFinished) |
||||||
|
{ |
||||||
|
Continue(); |
||||||
|
} |
||||||
|
} |
||||||
|
); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
audioSource.volume = 1; |
||||||
|
PlaySoundWithCallback(audioSource.audio.clip, endVolume, AudioFinished); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected void PlayLoop() |
||||||
|
{ |
||||||
|
if (fadeDuration > 0) |
||||||
|
{ |
||||||
|
audioSource.volume = 0; |
||||||
|
audioSource.loop = true; |
||||||
|
audioSource.audio.Play(); |
||||||
|
LeanTween.value(audioSource.gameObject,0,endVolume,fadeDuration |
||||||
|
).setOnUpdate( |
||||||
|
(float updateVolume)=>{ |
||||||
|
audioSource.volume = updateVolume; |
||||||
|
} |
||||||
|
).setOnComplete( |
||||||
|
()=>{ |
||||||
|
if (waitUntilFinished) |
||||||
|
{ |
||||||
|
Continue(); |
||||||
|
} |
||||||
|
} |
||||||
|
); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
audioSource.volume = 1; |
||||||
|
audioSource.loop = true; |
||||||
|
audioSource.audio.Play(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected void PauseLoop() |
||||||
|
{ |
||||||
|
if (fadeDuration > 0) |
||||||
|
{ |
||||||
|
LeanTween.value(audioSource.gameObject,audioSource.volume,0,fadeDuration |
||||||
|
).setOnUpdate( |
||||||
|
(float updateVolume)=>{ |
||||||
|
audioSource.volume = updateVolume; |
||||||
|
} |
||||||
|
).setOnComplete( |
||||||
|
()=>{ |
||||||
|
|
||||||
|
audioSource.audio.Pause(); |
||||||
|
if (waitUntilFinished) |
||||||
|
{ |
||||||
|
Continue(); |
||||||
|
} |
||||||
|
} |
||||||
|
); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
audioSource.audio.Pause(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected void StopLoop() |
||||||
|
{ |
||||||
|
if (fadeDuration > 0) |
||||||
|
{ |
||||||
|
LeanTween.value(audioSource.gameObject,audioSource.volume,0,fadeDuration |
||||||
|
).setOnUpdate( |
||||||
|
(float updateVolume)=>{ |
||||||
|
audioSource.volume = updateVolume; |
||||||
|
} |
||||||
|
).setOnComplete( |
||||||
|
()=>{ |
||||||
|
|
||||||
|
audioSource.audio.Stop(); |
||||||
|
if (waitUntilFinished) |
||||||
|
{ |
||||||
|
Continue(); |
||||||
|
} |
||||||
|
} |
||||||
|
); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
audioSource.audio.Stop(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected void ChangeVolume() |
||||||
|
{ |
||||||
|
LeanTween.value(audioSource.gameObject,audioSource.volume,endVolume,fadeDuration |
||||||
|
).setOnUpdate( |
||||||
|
(float updateVolume)=>{ |
||||||
|
audioSource.volume = updateVolume; |
||||||
|
} |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// Allows ControlAudio to "Wait Until Finished" playing audio before moving onto the next command |
||||||
|
public delegate void AudioCallback(); |
||||||
|
|
||||||
|
public void PlaySoundWithCallback(AudioClip clip, float endVolume, AudioCallback callback) |
||||||
|
{ |
||||||
|
audioSource.audio.PlayOneShot(audioSource.clip, endVolume); |
||||||
|
StartCoroutine(DelayedCallback(audioSource.clip.length, callback)); |
||||||
|
} |
||||||
|
|
||||||
|
private IEnumerator DelayedCallback(float time, AudioCallback callback) |
||||||
|
{ |
||||||
|
yield return new WaitForSeconds(time); |
||||||
|
callback(); |
||||||
|
} |
||||||
|
|
||||||
|
void AudioFinished() |
||||||
|
{ |
||||||
|
Continue(); |
||||||
|
} |
||||||
|
|
||||||
|
public override string GetSummary() |
||||||
|
{ |
||||||
|
if (audioSource == null) |
||||||
|
{ |
||||||
|
return "Error: No sound clip selected"; |
||||||
|
} |
||||||
|
string fadeType = ""; |
||||||
|
if (fadeDuration > 0) |
||||||
|
{ |
||||||
|
fadeType = " Fade out"; |
||||||
|
if (control != controlType.StopLoop) |
||||||
|
{ |
||||||
|
fadeType = " Fade in volume to " + endVolume; |
||||||
|
} |
||||||
|
if (control == controlType.ChangeVolume) |
||||||
|
{ |
||||||
|
fadeType = " to " + endVolume; |
||||||
|
} |
||||||
|
fadeType += " over " + fadeDuration + " seconds."; |
||||||
|
} |
||||||
|
return control.ToString() + " \"" + audioSource.name + "\"" + fadeType; |
||||||
|
} |
||||||
|
|
||||||
|
public override Color GetButtonColor() |
||||||
|
{ |
||||||
|
return new Color32(242, 209, 176, 255); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue