123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using System;
- namespace Enviro
- {
- [Serializable]
- public class EnviroAudio
- {
- public List<EnviroAudioClip> ambientClips = new List<EnviroAudioClip>();
- public List<EnviroAudioClip> weatherClips = new List<EnviroAudioClip>();
- public List<EnviroAudioClip> thunderClips = new List<EnviroAudioClip>();
- public float ambientMasterVolume = 1f;
- public float weatherMasterVolume = 1f;
- public float thunderMasterVolume = 1f;
- }
- [Serializable]
- public class EnviroAudioClip
- {
- public enum PlayBackType
- {
- Always,
- BasedOnSun,
- BasedOnMoon
- }
- public bool showEditor;
- public string name;
- public AudioClip audioClip;
- public PlayBackType playBackType;
- public AudioSource myAudioSource;
- public bool loop = false;
- public float volume = 0f;
- public AnimationCurve volumeCurve = new AnimationCurve();
- public float maxVolume = 1f;
- }
-
- [Serializable]
- [ExecuteInEditMode]
- public class EnviroAudioModule : EnviroModule
- {
- public Enviro.EnviroAudio Settings;
- public EnviroAudioModule preset;
- //Inspector
- public bool showAmbientSetupControls,showWeatherSetupControls,showThunderSetupControls, showAudioControls;
- public override void Enable ()
- {
- CreateAudio();
- }
- public override void Disable ()
- {
- Cleanup();
- }
- private void Setup()
- {
-
- }
- private void Cleanup()
- {
- if(EnviroManager.instance.Objects.audio != null)
- DestroyImmediate(EnviroManager.instance.Objects.audio);
- }
-
- // Update Method
- public override void UpdateModule ()
- {
- UpdateAudio();
- }
- public void CreateAudio()
- {
- if(EnviroManager.instance.Objects.audio != null)
- DestroyImmediate(EnviroManager.instance.Objects.audio);
- if(EnviroManager.instance.Objects.audio == null)
- {
- EnviroManager.instance.Objects.audio = new GameObject();
- EnviroManager.instance.Objects.audio.name = "Audio";
- EnviroManager.instance.Objects.audio.transform.SetParent(EnviroManager.instance.transform);
- EnviroManager.instance.Objects.audio.transform.localPosition = Vector3.zero;
- }
- //Ambient
- for(int i = 0; i < Settings.ambientClips.Count; i++)
- {
- if(Settings.ambientClips[i].myAudioSource != null)
- DestroyImmediate(Settings.ambientClips[i].myAudioSource.gameObject);
- GameObject sys;
-
- if(Settings.ambientClips[i].audioClip != null)
- {
- sys = new GameObject();
- sys.name = "Ambient - " +Settings.ambientClips[i].name;
- sys.transform.SetParent(EnviroManager.instance.Objects.audio.transform);
- Settings.ambientClips[i].myAudioSource = sys.AddComponent<AudioSource>();
- Settings.ambientClips[i].myAudioSource.clip = Settings.ambientClips[i].audioClip;
- Settings.ambientClips[i].myAudioSource.loop = Settings.ambientClips[i].loop;
- Settings.ambientClips[i].myAudioSource.volume = Settings.ambientClips[i].volume;
- }
- }
- //Weather
- for(int i = 0; i < Settings.weatherClips.Count; i++)
- {
- if(Settings.weatherClips[i].myAudioSource != null)
- DestroyImmediate(Settings.weatherClips[i].myAudioSource.gameObject);
- GameObject sys;
-
- if(Settings.weatherClips[i].audioClip != null)
- {
- sys = new GameObject();
- sys.name = "Weather - " + Settings.weatherClips[i].name;
- sys.transform.SetParent(EnviroManager.instance.Objects.audio.transform);
- Settings.weatherClips[i].myAudioSource = sys.AddComponent<AudioSource>();
- Settings.weatherClips[i].myAudioSource.clip = Settings.weatherClips[i].audioClip;
- Settings.weatherClips[i].myAudioSource.loop = Settings.weatherClips[i].loop;
- Settings.weatherClips[i].myAudioSource.volume = Settings.weatherClips[i].volume;
- }
- }
- //Tunder
- for(int i = 0; i < Settings.thunderClips.Count; i++)
- {
- if(Settings.thunderClips[i].myAudioSource != null)
- DestroyImmediate(Settings.thunderClips[i].myAudioSource.gameObject);
- GameObject sys;
-
- if(Settings.thunderClips[i].audioClip != null)
- {
- sys = new GameObject();
- sys.name = "Thunder - " + Settings.thunderClips[i].name;
- sys.transform.SetParent(EnviroManager.instance.Objects.audio.transform);
- Settings.thunderClips[i].myAudioSource = sys.AddComponent<AudioSource>();
- Settings.thunderClips[i].myAudioSource.clip = Settings.thunderClips[i].audioClip;
- Settings.thunderClips[i].myAudioSource.loop = false;
- Settings.thunderClips[i].myAudioSource.playOnAwake = false;
- Settings.thunderClips[i].myAudioSource.volume = Settings.thunderClips[i].volume;
- }
- }
- }
- //Plays random thunder SFX audio.
- public void PlayRandomThunderSFX()
- {
- int thunderSFX = UnityEngine.Random.Range(0,Settings.thunderClips.Count);
- // if(!Settings.thunderClips[thunderSFX].myAudioSource.isPlaying)
- // {
- Settings.thunderClips[thunderSFX].myAudioSource.PlayOneShot(Settings.thunderClips[thunderSFX].myAudioSource.clip);
- // }
- // else
- // {
- //Try again until we get a free audio source.
- // PlayRandomThunderSFX();
- // }
- }
- public void UpdateAudio()
- {
- for(int i = 0; i < Settings.ambientClips.Count; i++)
- {
- UpdateEnviroAudioClip(Settings.ambientClips[i],Settings.ambientMasterVolume);
- }
- for(int i = 0; i < Settings.weatherClips.Count; i++)
- {
- UpdateEnviroAudioClip(Settings.weatherClips[i],Settings.weatherMasterVolume);
- }
- }
- void UpdateEnviroAudioClip(EnviroAudioClip clip, float masterVolume)
- {
- if(clip.audioClip != null && clip.myAudioSource != null)
- {
- if(!Application.isPlaying)
- {
- clip.myAudioSource.Stop();
- return;
- }
-
- clip.myAudioSource.loop = clip.loop;
- switch (clip.playBackType)
- {
- case EnviroAudioClip.PlayBackType.Always:
- clip.myAudioSource.volume = clip.volume * masterVolume;
- break;
- case EnviroAudioClip.PlayBackType.BasedOnSun:
- clip.myAudioSource.volume = clip.volumeCurve.Evaluate(EnviroManager.instance.solarTime);
- clip.myAudioSource.volume *= clip.volume * masterVolume;
- break;
- case EnviroAudioClip.PlayBackType.BasedOnMoon:
- clip.myAudioSource.volume = clip.volumeCurve.Evaluate(EnviroManager.instance.lunarTime);
- clip.myAudioSource.volume *= clip.volume * masterVolume;
- break;
- }
-
- //Enable or disable playback based on volume
- if(clip.myAudioSource.volume < 0.001f && clip.myAudioSource.isPlaying)
- clip.myAudioSource.Stop();
- if(clip.myAudioSource.volume > 0f && !clip.myAudioSource.isPlaying)
- clip.myAudioSource.Play();
- }
- }
- //Save and Load
- public void LoadModuleValues ()
- {
- if(preset != null)
- {
- Settings = JsonUtility.FromJson<Enviro.EnviroAudio>(JsonUtility.ToJson(preset.Settings));
- }
- else
- {
- Debug.Log("Please assign a saved module to load from!");
- }
- }
- public void SaveModuleValues ()
- {
- #if UNITY_EDITOR
- EnviroAudioModule t = ScriptableObject.CreateInstance<EnviroAudioModule>();
- t.name = "Audio Module";
- t.Settings = JsonUtility.FromJson<Enviro.EnviroAudio>(JsonUtility.ToJson(Settings));
-
- string assetPathAndName = UnityEditor.AssetDatabase.GenerateUniqueAssetPath("Assets/Enviro 3" + "/New " + t.name + ".asset");
- UnityEditor.AssetDatabase.CreateAsset(t, assetPathAndName);
- UnityEditor.AssetDatabase.SaveAssets();
- UnityEditor.AssetDatabase.Refresh();
- #endif
- }
- public void SaveModuleValues (EnviroAudioModule module)
- {
- module.Settings = JsonUtility.FromJson<Enviro.EnviroAudio>(JsonUtility.ToJson(Settings));
- #if UNITY_EDITOR
- UnityEditor.EditorUtility.SetDirty(module);
- UnityEditor.AssetDatabase.SaveAssets();
- #endif
- }
- }
- }
|