Lightning.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Runtime.InteropServices;
  4. namespace Enviro
  5. {
  6. public class Lightning : MonoBehaviour
  7. {
  8. public Vector3 target;
  9. private LineRenderer lineRend;
  10. public Light myLight;
  11. public Material planeMat;
  12. public int arcs = 20;
  13. public float arcLength = 100.0f;
  14. public float arcVariation = 1.0f;
  15. public float inaccuracy = 0.5f;
  16. public int splits = 4;
  17. public Vector3 toTarget;
  18. private bool fadeOut;
  19. private float fadeTimer;
  20. /*
  21. private ComputeBuffer cloudsLighning;
  22. struct LightningParams
  23. {
  24. public Vector3 pos;
  25. public float range;
  26. public float intensity;
  27. }
  28. LightningParams[] lightningParams;
  29. */
  30. void OnEnable ()
  31. {
  32. lineRend = gameObject.GetComponent<LineRenderer> ();
  33. CastBolt();
  34. }
  35. IEnumerator CreateLightningBolt()
  36. {
  37. /* if(Enviro.EnviroManager.instance.cloudModule != null)
  38. {
  39. lightningParams = new LightningParams[1];
  40. lightningParams[0].pos = transform.position;
  41. lightningParams[0].range = 10f;
  42. lightningParams[0].intensity = 0.1f;
  43. Enviro.EnviroManager.instance.cloudModule.blendAndLightingMat.SetFloat("_LightningCount", 1);
  44. Enviro.EnviroHelper.CreateBuffer(ref cloudsLighning, 1, Marshal.SizeOf(typeof(LightningParams)));
  45. cloudsLighning.SetData(lightningParams);
  46. Enviro.EnviroManager.instance.cloudModule.blendAndLightingMat.SetBuffer("_Lightnings",cloudsLighning);
  47. }*/
  48. myLight.enabled = false;
  49. lineRend.widthMultiplier = 5;
  50. planeMat.SetFloat("_Intensity", 1f);
  51. lineRend.SetPosition(0, transform.position);
  52. lineRend.positionCount = 2;
  53. lineRend.SetPosition(1, transform.position);
  54. Vector3 lastPoint = transform.position;
  55. float dist = Vector3.Distance(transform.position, target);
  56. float arcDist = dist / arcs;
  57. for (int i = 1; i < arcs; i++)
  58. {
  59. planeMat.SetFloat("_Intensity", Random.Range(0f,2f));
  60. lineRend.positionCount = i + 1;
  61. Vector3 fwd = target - lastPoint;
  62. fwd.Normalize ();
  63. Vector3 pos = Randomize (fwd, inaccuracy);
  64. pos *= Random.Range (arcLength * arcVariation, arcLength) * (arcDist);
  65. pos += lastPoint;
  66. lineRend.SetPosition (i, pos);
  67. if(i < arcs - 2)
  68. {
  69. for (int s = 0; s <= splits; s++)
  70. {
  71. StartCoroutine(CreateSplit(pos, target));
  72. }
  73. }
  74. lastPoint = pos;
  75. yield return new WaitForSeconds(Random.Range(0.001f,0.005f));
  76. }
  77. lineRend.SetPosition(arcs-1,target);
  78. //Animate Light and Main bolt
  79. myLight.transform.position = target;
  80. lineRend.material.SetFloat("_Intensity", 50f);
  81. planeMat.SetFloat("_Intensity", 20f);
  82. myLight.enabled = true;
  83. yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
  84. lineRend.material.SetFloat("_Intensity", 1f);
  85. planeMat.SetFloat("_Intensity", 1f);
  86. myLight.enabled = false;
  87. yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
  88. lineRend.material.SetFloat("_Intensity", 50f);
  89. planeMat.SetFloat("_Intensity", 20f);
  90. myLight.enabled = true;
  91. yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
  92. lineRend.material.SetFloat("_Intensity", 1f);
  93. planeMat.SetFloat("_Intensity", 1f);
  94. myLight.enabled = false;
  95. yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
  96. lineRend.material.SetFloat("_Intensity", 50f);
  97. planeMat.SetFloat("_Intensity", 0f);
  98. myLight.enabled = true;
  99. yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
  100. myLight.enabled = false;
  101. fadeTimer = 50f;
  102. fadeOut = true;
  103. //lineRend.positionCount = 1;
  104. // Enviro.EnviroManager.instance.cloudModule.blendAndLightingMat.SetFloat("_LightningCount", 0);
  105. // Enviro.EnviroManager.instance.cloudModule.blendAndLightingMat.SetBuffer("_Lightnings",cloudsLighning);
  106. // Enviro.EnviroHelper.ReleaseComputeBuffer(ref cloudsLighning);
  107. }
  108. IEnumerator CreateSplit(Vector3 pos, Vector3 targetP)
  109. {
  110. GameObject split = new GameObject();
  111. split.transform.SetParent(transform);
  112. split.transform.position = pos;
  113. LineRenderer splitRenderer = split.AddComponent<LineRenderer>();
  114. splitRenderer.material = lineRend.material;
  115. splitRenderer.positionCount = 2;
  116. splitRenderer.SetPosition(0, split.transform.position);
  117. splitRenderer.SetPosition(1, split.transform.position);
  118. //Set a random target
  119. toTarget = targetP - pos;
  120. toTarget = Vector3.Normalize(toTarget);
  121. Vector3 posDown = new Vector3(toTarget.x,toTarget.y, toTarget.z * 0.1f);
  122. Vector3 targetPos = (Random.insideUnitSphere * 500 + pos + toTarget * 500);
  123. Vector3 lastPoint = split.transform.position;
  124. float dist = Vector3.Distance(split.transform.position, targetPos);
  125. float arcDist = dist / 7;
  126. for (int i = 1; i < 8; i++)
  127. {
  128. splitRenderer.positionCount = i + 1;
  129. Vector3 fwd = targetPos - lastPoint;
  130. fwd.Normalize ();
  131. Vector3 newPos = Randomize (fwd, inaccuracy);
  132. newPos *= Random.Range (1f * 1.5f, 1f) * (arcDist);
  133. newPos += lastPoint;
  134. splitRenderer.SetPosition (i, newPos);
  135. lastPoint = newPos;
  136. yield return new WaitForSeconds(Random.Range(0.004f,0.006f));
  137. }
  138. splitRenderer.SetPosition(7,targetPos);
  139. yield return new WaitForSeconds(Random.Range(0.2f,0.5f));
  140. DestroyImmediate(split);
  141. }
  142. public void CastBolt()
  143. {
  144. lineRend.positionCount = 1;
  145. StartCoroutine(CreateLightningBolt());
  146. }
  147. private Vector3 Randomize (Vector3 newVector, float devation) {
  148. newVector += new Vector3(Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f)) * devation;
  149. newVector.Normalize();
  150. return newVector;
  151. }
  152. private void Update()
  153. {
  154. if(fadeOut == true)
  155. {
  156. fadeTimer = Mathf.Lerp(fadeTimer,0f,10f * Time.deltaTime);
  157. lineRend.material.SetFloat("_Intensity", fadeTimer);
  158. if(fadeTimer <= 1f)
  159. {
  160. lineRend.positionCount = 1;
  161. fadeOut = false;
  162. DestroyImmediate(gameObject);
  163. }
  164. }
  165. }
  166. }
  167. }