EnviroEffectsModule.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using System;
  5. namespace Enviro
  6. {
  7. [Serializable]
  8. public class EnviroEffectTypes
  9. {
  10. public enum ControlType
  11. {
  12. Rain1,
  13. Rain2,
  14. Snow1,
  15. Snow2,
  16. Custom1,
  17. Custom2
  18. }
  19. public ControlType controlType;
  20. public ParticleSystem mySystem;
  21. public string name;
  22. public GameObject prefab;
  23. public Vector3 localPositionOffset;
  24. public Vector3 localRotationOffset;
  25. public float maxEmission;
  26. }
  27. [Serializable]
  28. public class EnviroEffects
  29. {
  30. public List<EnviroEffectTypes> effectTypes = new List<EnviroEffectTypes>();
  31. [Range(0f,1f)]
  32. public float rain1Emission, rain2Emission, snow1Emission, snow2Emission, custom1Emission, custom2Emission = 0f;
  33. }
  34. [Serializable]
  35. [ExecuteInEditMode]
  36. public class EnviroEffectsModule : EnviroModule
  37. {
  38. public Enviro.EnviroEffects Settings;
  39. public EnviroEffectsModule preset;
  40. //Inspector
  41. public bool showSetupControls;
  42. public bool showEmissionControls;
  43. public override void Enable ()
  44. {
  45. Setup();
  46. }
  47. public override void Disable ()
  48. {
  49. Cleanup();
  50. }
  51. private void Setup()
  52. {
  53. CreateEffects();
  54. }
  55. private void Cleanup()
  56. {
  57. if(EnviroManager.instance.Objects.effects != null)
  58. DestroyImmediate(EnviroManager.instance.Objects.effects);
  59. }
  60. public override void UpdateModule ()
  61. {
  62. UpdateEffects();
  63. }
  64. public void CreateEffects()
  65. {
  66. if(EnviroManager.instance.Objects.effects != null)
  67. DestroyImmediate(EnviroManager.instance.Objects.effects);
  68. if(EnviroManager.instance.Objects.effects == null)
  69. {
  70. EnviroManager.instance.Objects.effects = new GameObject();
  71. EnviroManager.instance.Objects.effects.name = "Effects";
  72. EnviroManager.instance.Objects.effects.transform.SetParent(EnviroManager.instance.transform);
  73. EnviroManager.instance.Objects.effects.transform.localPosition = Vector3.zero;
  74. }
  75. for(int i = 0; i < Settings.effectTypes.Count; i++)
  76. {
  77. if(Settings.effectTypes[i].mySystem != null)
  78. DestroyImmediate(Settings.effectTypes[i].mySystem.gameObject);
  79. GameObject sys;
  80. if(Settings.effectTypes[i].prefab != null)
  81. {
  82. sys = Instantiate(Settings.effectTypes[i].prefab,Settings.effectTypes[i].localPositionOffset,Quaternion.identity);
  83. sys.transform.SetParent(EnviroManager.instance.Objects.effects.transform);
  84. sys.name = Settings.effectTypes[i].name;
  85. sys.transform.localPosition = Settings.effectTypes[i].localPositionOffset;
  86. sys.transform.localEulerAngles = Settings.effectTypes[i].localRotationOffset;
  87. Settings.effectTypes[i].mySystem = sys.GetComponent<ParticleSystem>();
  88. }
  89. }
  90. }
  91. public float GetEmissionRate(ParticleSystem system)
  92. {
  93. return system.emission.rateOverTime.constantMax;
  94. }
  95. public void SetEmissionRate(ParticleSystem sys, float emissionRate)
  96. {
  97. var emission = sys.emission;
  98. var rate = emission.rateOverTime;
  99. rate.constantMax = emissionRate;
  100. emission.rateOverTime = rate;
  101. }
  102. private void UpdateEffects()
  103. {
  104. for(int i = 0; i < Settings.effectTypes.Count; i++)
  105. {
  106. if(Settings.effectTypes[i].mySystem != null)
  107. {
  108. float currentEmission = Settings.effectTypes[i].maxEmission;
  109. switch(Settings.effectTypes[i].controlType)
  110. {
  111. case EnviroEffectTypes.ControlType.Rain1:
  112. currentEmission *= Settings.rain1Emission;
  113. break;
  114. case EnviroEffectTypes.ControlType.Rain2:
  115. currentEmission *= Settings.rain2Emission;
  116. break;
  117. case EnviroEffectTypes.ControlType.Snow1:
  118. currentEmission *= Settings.snow1Emission;
  119. break;
  120. case EnviroEffectTypes.ControlType.Snow2:
  121. currentEmission *= Settings.snow2Emission;
  122. break;
  123. case EnviroEffectTypes.ControlType.Custom1:
  124. currentEmission *= Settings.custom1Emission;
  125. break;
  126. case EnviroEffectTypes.ControlType.Custom2:
  127. currentEmission *= Settings.custom2Emission;
  128. break;
  129. }
  130. SetEmissionRate(Settings.effectTypes[i].mySystem,currentEmission);
  131. if(currentEmission > 0f && !Settings.effectTypes[i].mySystem.isPlaying)
  132. Settings.effectTypes[i].mySystem.Play();
  133. }
  134. }
  135. }
  136. //Save and Load
  137. public void LoadModuleValues ()
  138. {
  139. if(preset != null)
  140. {
  141. Settings = JsonUtility.FromJson<Enviro.EnviroEffects>(JsonUtility.ToJson(preset.Settings));
  142. }
  143. else
  144. {
  145. Debug.Log("Please assign a saved module to load from!");
  146. }
  147. }
  148. public void SaveModuleValues ()
  149. {
  150. #if UNITY_EDITOR
  151. EnviroEffectsModule t = ScriptableObject.CreateInstance<EnviroEffectsModule>();
  152. t.name = "Effects Module";
  153. t.Settings = JsonUtility.FromJson<Enviro.EnviroEffects>(JsonUtility.ToJson(Settings));
  154. string assetPathAndName = UnityEditor.AssetDatabase.GenerateUniqueAssetPath("Assets/Enviro 3" + "/New " + t.name + ".asset");
  155. UnityEditor.AssetDatabase.CreateAsset(t, assetPathAndName);
  156. UnityEditor.AssetDatabase.SaveAssets();
  157. UnityEditor.AssetDatabase.Refresh();
  158. #endif
  159. }
  160. public void SaveModuleValues (EnviroEffectsModule module)
  161. {
  162. module.Settings = JsonUtility.FromJson<Enviro.EnviroEffects>(JsonUtility.ToJson(Settings));
  163. #if UNITY_EDITOR
  164. UnityEditor.EditorUtility.SetDirty(module);
  165. UnityEditor.AssetDatabase.SaveAssets();
  166. #endif
  167. }
  168. }
  169. }