EnviroAudioModule.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System;
  5. namespace Enviro
  6. {
  7. [Serializable]
  8. public class EnviroAudio
  9. {
  10. public List<EnviroAudioClip> ambientClips = new List<EnviroAudioClip>();
  11. public List<EnviroAudioClip> weatherClips = new List<EnviroAudioClip>();
  12. public List<EnviroAudioClip> thunderClips = new List<EnviroAudioClip>();
  13. public float ambientMasterVolume = 1f;
  14. public float weatherMasterVolume = 1f;
  15. public float thunderMasterVolume = 1f;
  16. }
  17. [Serializable]
  18. public class EnviroAudioClip
  19. {
  20. public enum PlayBackType
  21. {
  22. Always,
  23. BasedOnSun,
  24. BasedOnMoon
  25. }
  26. public bool showEditor;
  27. public string name;
  28. public AudioClip audioClip;
  29. public PlayBackType playBackType;
  30. public AudioSource myAudioSource;
  31. public bool loop = false;
  32. public float volume = 0f;
  33. public AnimationCurve volumeCurve = new AnimationCurve();
  34. public float maxVolume = 1f;
  35. }
  36. [Serializable]
  37. [ExecuteInEditMode]
  38. public class EnviroAudioModule : EnviroModule
  39. {
  40. public Enviro.EnviroAudio Settings;
  41. public EnviroAudioModule preset;
  42. //Inspector
  43. public bool showAmbientSetupControls,showWeatherSetupControls,showThunderSetupControls, showAudioControls;
  44. public override void Enable ()
  45. {
  46. CreateAudio();
  47. }
  48. public override void Disable ()
  49. {
  50. Cleanup();
  51. }
  52. private void Setup()
  53. {
  54. }
  55. private void Cleanup()
  56. {
  57. if(EnviroManager.instance.Objects.audio != null)
  58. DestroyImmediate(EnviroManager.instance.Objects.audio);
  59. }
  60. // Update Method
  61. public override void UpdateModule ()
  62. {
  63. UpdateAudio();
  64. }
  65. public void CreateAudio()
  66. {
  67. if(EnviroManager.instance.Objects.audio != null)
  68. DestroyImmediate(EnviroManager.instance.Objects.audio);
  69. if(EnviroManager.instance.Objects.audio == null)
  70. {
  71. EnviroManager.instance.Objects.audio = new GameObject();
  72. EnviroManager.instance.Objects.audio.name = "Audio";
  73. EnviroManager.instance.Objects.audio.transform.SetParent(EnviroManager.instance.transform);
  74. EnviroManager.instance.Objects.audio.transform.localPosition = Vector3.zero;
  75. }
  76. //Ambient
  77. for(int i = 0; i < Settings.ambientClips.Count; i++)
  78. {
  79. if(Settings.ambientClips[i].myAudioSource != null)
  80. DestroyImmediate(Settings.ambientClips[i].myAudioSource.gameObject);
  81. GameObject sys;
  82. if(Settings.ambientClips[i].audioClip != null)
  83. {
  84. sys = new GameObject();
  85. sys.name = "Ambient - " +Settings.ambientClips[i].name;
  86. sys.transform.SetParent(EnviroManager.instance.Objects.audio.transform);
  87. Settings.ambientClips[i].myAudioSource = sys.AddComponent<AudioSource>();
  88. Settings.ambientClips[i].myAudioSource.clip = Settings.ambientClips[i].audioClip;
  89. Settings.ambientClips[i].myAudioSource.loop = Settings.ambientClips[i].loop;
  90. Settings.ambientClips[i].myAudioSource.volume = Settings.ambientClips[i].volume;
  91. }
  92. }
  93. //Weather
  94. for(int i = 0; i < Settings.weatherClips.Count; i++)
  95. {
  96. if(Settings.weatherClips[i].myAudioSource != null)
  97. DestroyImmediate(Settings.weatherClips[i].myAudioSource.gameObject);
  98. GameObject sys;
  99. if(Settings.weatherClips[i].audioClip != null)
  100. {
  101. sys = new GameObject();
  102. sys.name = "Weather - " + Settings.weatherClips[i].name;
  103. sys.transform.SetParent(EnviroManager.instance.Objects.audio.transform);
  104. Settings.weatherClips[i].myAudioSource = sys.AddComponent<AudioSource>();
  105. Settings.weatherClips[i].myAudioSource.clip = Settings.weatherClips[i].audioClip;
  106. Settings.weatherClips[i].myAudioSource.loop = Settings.weatherClips[i].loop;
  107. Settings.weatherClips[i].myAudioSource.volume = Settings.weatherClips[i].volume;
  108. }
  109. }
  110. //Tunder
  111. for(int i = 0; i < Settings.thunderClips.Count; i++)
  112. {
  113. if(Settings.thunderClips[i].myAudioSource != null)
  114. DestroyImmediate(Settings.thunderClips[i].myAudioSource.gameObject);
  115. GameObject sys;
  116. if(Settings.thunderClips[i].audioClip != null)
  117. {
  118. sys = new GameObject();
  119. sys.name = "Thunder - " + Settings.thunderClips[i].name;
  120. sys.transform.SetParent(EnviroManager.instance.Objects.audio.transform);
  121. Settings.thunderClips[i].myAudioSource = sys.AddComponent<AudioSource>();
  122. Settings.thunderClips[i].myAudioSource.clip = Settings.thunderClips[i].audioClip;
  123. Settings.thunderClips[i].myAudioSource.loop = false;
  124. Settings.thunderClips[i].myAudioSource.playOnAwake = false;
  125. Settings.thunderClips[i].myAudioSource.volume = Settings.thunderClips[i].volume;
  126. }
  127. }
  128. }
  129. //Plays random thunder SFX audio.
  130. public void PlayRandomThunderSFX()
  131. {
  132. int thunderSFX = UnityEngine.Random.Range(0,Settings.thunderClips.Count);
  133. // if(!Settings.thunderClips[thunderSFX].myAudioSource.isPlaying)
  134. // {
  135. Settings.thunderClips[thunderSFX].myAudioSource.PlayOneShot(Settings.thunderClips[thunderSFX].myAudioSource.clip);
  136. // }
  137. // else
  138. // {
  139. //Try again until we get a free audio source.
  140. // PlayRandomThunderSFX();
  141. // }
  142. }
  143. public void UpdateAudio()
  144. {
  145. for(int i = 0; i < Settings.ambientClips.Count; i++)
  146. {
  147. UpdateEnviroAudioClip(Settings.ambientClips[i],Settings.ambientMasterVolume);
  148. }
  149. for(int i = 0; i < Settings.weatherClips.Count; i++)
  150. {
  151. UpdateEnviroAudioClip(Settings.weatherClips[i],Settings.weatherMasterVolume);
  152. }
  153. }
  154. void UpdateEnviroAudioClip(EnviroAudioClip clip, float masterVolume)
  155. {
  156. if(clip.audioClip != null && clip.myAudioSource != null)
  157. {
  158. if(!Application.isPlaying)
  159. {
  160. clip.myAudioSource.Stop();
  161. return;
  162. }
  163. clip.myAudioSource.loop = clip.loop;
  164. switch (clip.playBackType)
  165. {
  166. case EnviroAudioClip.PlayBackType.Always:
  167. clip.myAudioSource.volume = clip.volume * masterVolume;
  168. break;
  169. case EnviroAudioClip.PlayBackType.BasedOnSun:
  170. clip.myAudioSource.volume = clip.volumeCurve.Evaluate(EnviroManager.instance.solarTime);
  171. clip.myAudioSource.volume *= clip.volume * masterVolume;
  172. break;
  173. case EnviroAudioClip.PlayBackType.BasedOnMoon:
  174. clip.myAudioSource.volume = clip.volumeCurve.Evaluate(EnviroManager.instance.lunarTime);
  175. clip.myAudioSource.volume *= clip.volume * masterVolume;
  176. break;
  177. }
  178. //Enable or disable playback based on volume
  179. if(clip.myAudioSource.volume < 0.001f && clip.myAudioSource.isPlaying)
  180. clip.myAudioSource.Stop();
  181. if(clip.myAudioSource.volume > 0f && !clip.myAudioSource.isPlaying)
  182. clip.myAudioSource.Play();
  183. }
  184. }
  185. //Save and Load
  186. public void LoadModuleValues ()
  187. {
  188. if(preset != null)
  189. {
  190. Settings = JsonUtility.FromJson<Enviro.EnviroAudio>(JsonUtility.ToJson(preset.Settings));
  191. }
  192. else
  193. {
  194. Debug.Log("Please assign a saved module to load from!");
  195. }
  196. }
  197. public void SaveModuleValues ()
  198. {
  199. #if UNITY_EDITOR
  200. EnviroAudioModule t = ScriptableObject.CreateInstance<EnviroAudioModule>();
  201. t.name = "Audio Module";
  202. t.Settings = JsonUtility.FromJson<Enviro.EnviroAudio>(JsonUtility.ToJson(Settings));
  203. string assetPathAndName = UnityEditor.AssetDatabase.GenerateUniqueAssetPath("Assets/Enviro 3" + "/New " + t.name + ".asset");
  204. UnityEditor.AssetDatabase.CreateAsset(t, assetPathAndName);
  205. UnityEditor.AssetDatabase.SaveAssets();
  206. UnityEditor.AssetDatabase.Refresh();
  207. #endif
  208. }
  209. public void SaveModuleValues (EnviroAudioModule module)
  210. {
  211. module.Settings = JsonUtility.FromJson<Enviro.EnviroAudio>(JsonUtility.ToJson(Settings));
  212. #if UNITY_EDITOR
  213. UnityEditor.EditorUtility.SetDirty(module);
  214. UnityEditor.AssetDatabase.SaveAssets();
  215. #endif
  216. }
  217. }
  218. }