123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- using UnityEngine;
- using System.Collections;
- using System.Runtime.InteropServices;
- namespace Enviro
- {
- public class Lightning : MonoBehaviour
- {
- public Vector3 target;
- private LineRenderer lineRend;
- public Light myLight;
- public Material planeMat;
- public int arcs = 20;
- public float arcLength = 100.0f;
- public float arcVariation = 1.0f;
- public float inaccuracy = 0.5f;
- public int splits = 4;
- public Vector3 toTarget;
- private bool fadeOut;
- private float fadeTimer;
- /*
- private ComputeBuffer cloudsLighning;
- struct LightningParams
- {
- public Vector3 pos;
- public float range;
- public float intensity;
- }
- LightningParams[] lightningParams;
- */
- void OnEnable ()
- {
- lineRend = gameObject.GetComponent<LineRenderer> ();
- CastBolt();
- }
- IEnumerator CreateLightningBolt()
- {
- /* if(Enviro.EnviroManager.instance.cloudModule != null)
- {
- lightningParams = new LightningParams[1];
- lightningParams[0].pos = transform.position;
- lightningParams[0].range = 10f;
- lightningParams[0].intensity = 0.1f;
- Enviro.EnviroManager.instance.cloudModule.blendAndLightingMat.SetFloat("_LightningCount", 1);
- Enviro.EnviroHelper.CreateBuffer(ref cloudsLighning, 1, Marshal.SizeOf(typeof(LightningParams)));
- cloudsLighning.SetData(lightningParams);
- Enviro.EnviroManager.instance.cloudModule.blendAndLightingMat.SetBuffer("_Lightnings",cloudsLighning);
- }*/
- myLight.enabled = false;
- lineRend.widthMultiplier = 5;
- planeMat.SetFloat("_Intensity", 1f);
- lineRend.SetPosition(0, transform.position);
- lineRend.positionCount = 2;
- lineRend.SetPosition(1, transform.position);
- Vector3 lastPoint = transform.position;
- float dist = Vector3.Distance(transform.position, target);
- float arcDist = dist / arcs;
- for (int i = 1; i < arcs; i++)
- {
- planeMat.SetFloat("_Intensity", Random.Range(0f,2f));
- lineRend.positionCount = i + 1;
- Vector3 fwd = target - lastPoint;
- fwd.Normalize ();
- Vector3 pos = Randomize (fwd, inaccuracy);
- pos *= Random.Range (arcLength * arcVariation, arcLength) * (arcDist);
- pos += lastPoint;
- lineRend.SetPosition (i, pos);
-
- if(i < arcs - 2)
- {
- for (int s = 0; s <= splits; s++)
- {
- StartCoroutine(CreateSplit(pos, target));
- }
- }
- lastPoint = pos;
- yield return new WaitForSeconds(Random.Range(0.001f,0.005f));
- }
- lineRend.SetPosition(arcs-1,target);
- //Animate Light and Main bolt
- myLight.transform.position = target;
- lineRend.material.SetFloat("_Intensity", 50f);
- planeMat.SetFloat("_Intensity", 20f);
- myLight.enabled = true;
- yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
- lineRend.material.SetFloat("_Intensity", 1f);
- planeMat.SetFloat("_Intensity", 1f);
- myLight.enabled = false;
- yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
- lineRend.material.SetFloat("_Intensity", 50f);
- planeMat.SetFloat("_Intensity", 20f);
- myLight.enabled = true;
- yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
- lineRend.material.SetFloat("_Intensity", 1f);
- planeMat.SetFloat("_Intensity", 1f);
- myLight.enabled = false;
- yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
- lineRend.material.SetFloat("_Intensity", 50f);
- planeMat.SetFloat("_Intensity", 0f);
- myLight.enabled = true;
- yield return new WaitForSeconds(Random.Range(0.025f,0.035f));
- myLight.enabled = false;
- fadeTimer = 50f;
- fadeOut = true;
- //lineRend.positionCount = 1;
- // Enviro.EnviroManager.instance.cloudModule.blendAndLightingMat.SetFloat("_LightningCount", 0);
- // Enviro.EnviroManager.instance.cloudModule.blendAndLightingMat.SetBuffer("_Lightnings",cloudsLighning);
- // Enviro.EnviroHelper.ReleaseComputeBuffer(ref cloudsLighning);
- }
- IEnumerator CreateSplit(Vector3 pos, Vector3 targetP)
- {
- GameObject split = new GameObject();
- split.transform.SetParent(transform);
- split.transform.position = pos;
- LineRenderer splitRenderer = split.AddComponent<LineRenderer>();
- splitRenderer.material = lineRend.material;
- splitRenderer.positionCount = 2;
- splitRenderer.SetPosition(0, split.transform.position);
- splitRenderer.SetPosition(1, split.transform.position);
-
- //Set a random target
- toTarget = targetP - pos;
- toTarget = Vector3.Normalize(toTarget);
- Vector3 posDown = new Vector3(toTarget.x,toTarget.y, toTarget.z * 0.1f);
- Vector3 targetPos = (Random.insideUnitSphere * 500 + pos + toTarget * 500);
-
- Vector3 lastPoint = split.transform.position;
- float dist = Vector3.Distance(split.transform.position, targetPos);
- float arcDist = dist / 7;
- for (int i = 1; i < 8; i++)
- {
- splitRenderer.positionCount = i + 1;
- Vector3 fwd = targetPos - lastPoint;
- fwd.Normalize ();
- Vector3 newPos = Randomize (fwd, inaccuracy);
- newPos *= Random.Range (1f * 1.5f, 1f) * (arcDist);
- newPos += lastPoint;
- splitRenderer.SetPosition (i, newPos);
- lastPoint = newPos;
- yield return new WaitForSeconds(Random.Range(0.004f,0.006f));
- }
- splitRenderer.SetPosition(7,targetPos);
- yield return new WaitForSeconds(Random.Range(0.2f,0.5f));
- DestroyImmediate(split);
- }
-
- public void CastBolt()
- {
- lineRend.positionCount = 1;
- StartCoroutine(CreateLightningBolt());
- }
- private Vector3 Randomize (Vector3 newVector, float devation) {
- newVector += new Vector3(Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f), Random.Range(-1.0f, 1.0f)) * devation;
- newVector.Normalize();
- return newVector;
- }
- private void Update()
- {
- if(fadeOut == true)
- {
- fadeTimer = Mathf.Lerp(fadeTimer,0f,10f * Time.deltaTime);
- lineRend.material.SetFloat("_Intensity", fadeTimer);
- if(fadeTimer <= 1f)
- {
- lineRend.positionCount = 1;
- fadeOut = false;
- DestroyImmediate(gameObject);
- }
- }
- }
- }
- }
|