9 [UseWith(typeof(LineBase))]
12 const int GlobalMaxParticles = 2048;
13 const float GlobalParticleStartLifetime = 0.5f;
15 [Header(
"Particle Settings")]
17 [Range(128, GlobalMaxParticles)]
18 public int MaxParticles = GlobalMaxParticles;
20 public float ParticleStartLifetime = GlobalParticleStartLifetime;
22 [Header(
"Noise settings")]
23 public bool ParticleNoiseOnDisabled =
true;
24 public Vector3 NoiseStrength = Vector3.one;
25 public float NoiseFrequency = 1.2f;
27 public int NoiseOcatives = 3;
29 public float NoiseSpeed = 1f;
31 public float LifetimeAfterDisabled = 0.25f;
35 private ParticleSystem particles;
36 private ParticleSystem.Particle[] mainParticleArray =
new ParticleSystem.Particle[GlobalMaxParticles];
37 private ParticleSystemRenderer mainParticleRenderer;
38 private ParticleSystem.NoiseModule mainNoise;
39 private float decayStartTime = 0f;
43 particles = gameObject.EnsureComponent<ParticleSystem>();
45 mainNoise = particles.noise;
47 ParticleSystem.EmissionModule emission = particles.emission;
48 emission.rateOverTime =
new ParticleSystem.MinMaxCurve(0);
49 emission.rateOverDistance =
new ParticleSystem.MinMaxCurve(0);
50 emission.enabled =
true;
52 ParticleSystem.MainModule main = particles.main;
54 main.playOnAwake =
false;
55 main.maxParticles = Mathf.Min(MaxParticles, GlobalMaxParticles);
56 main.simulationSpace = ParticleSystemSimulationSpace.World;
58 ParticleSystem.ShapeModule shape = particles.shape;
59 shape.enabled =
false;
61 mainParticleRenderer = particles.GetComponent<ParticleSystemRenderer>();
62 mainParticleRenderer.sharedMaterial = LineMaterial;
65 for (
int i = 0; i < mainParticleArray.Length; i++)
67 ParticleSystem.Particle particle = mainParticleArray[i];
68 particle.startColor = Color.white;
69 particle.startSize = 1f;
70 particle.startLifetime =
float.MaxValue;
71 particle.remainingLifetime =
float.MaxValue;
72 particle.velocity = Vector3.zero;
73 particle.angularVelocity = 0;
74 mainParticleArray[i] = particle;
78 private void OnDisable()
80 if (mainParticleRenderer != null)
82 mainParticleRenderer.enabled =
false;
90 mainNoise.enabled = ParticleNoiseOnDisabled;
91 mainNoise.strengthX = NoiseStrength.x;
92 mainNoise.strengthY = NoiseStrength.y;
93 mainNoise.strengthZ = NoiseStrength.z;
94 mainNoise.octaveCount = NoiseOcatives;
95 mainNoise.scrollSpeed = NoiseSpeed;
96 mainNoise.frequency = NoiseFrequency;
98 if (decayStartTime < 0)
100 decayStartTime = Time.unscaledTime;
105 mainNoise.enabled =
false;
111 for (
int i = 0; i < NumLineSteps; i++)
113 float normalizedDistance = (1f / (NumLineSteps - 1)) * i;
114 ParticleSystem.Particle particle = mainParticleArray[i];
115 particle.position = Source.GetPoint(normalizedDistance);
116 particle.startColor = GetColor(normalizedDistance);
117 particle.startSize = GetWidth(normalizedDistance);
118 mainParticleArray[i] = particle;
123 int numDecayingParticles = particles.GetParticles(mainParticleArray);
124 for (
int i = 0; i < numDecayingParticles; i++)
126 float normalizedDistance = (1f / (NumLineSteps - 1)) * i;
127 mainParticleArray[i].startColor = DecayGradient.Evaluate((Time.unscaledTime - decayStartTime) / LifetimeAfterDisabled) * GetColor(normalizedDistance);
130 particles.SetParticles(mainParticleArray, NumLineSteps);