From eefef2097e6ebf6aef6bb401b1fb57ed31f6ca08 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Fri, 6 Aug 2021 11:59:30 +0200 Subject: [PATCH] Implemented split tracer trails for e.g. Scrag projectiles using Unity's radial velocity. Probably the least accurate particle effect recreation so far, but this one is very tricky to accurately emulate as it is in Quake. Also fixed the min/max random color thing for other trails. If we want to pick a random static color between two extremes, then we need to use min/max and not a gradient. --- .../Support/ParticleTrailController.cs | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Assets/Scripts/Support/ParticleTrailController.cs b/Assets/Scripts/Support/ParticleTrailController.cs index 2dda512..6b0565c 100644 --- a/Assets/Scripts/Support/ParticleTrailController.cs +++ b/Assets/Scripts/Support/ParticleTrailController.cs @@ -40,7 +40,7 @@ public class ParticleTrailController : MonoBehaviour case ParticleTrail.Blood: { main.gravityModifierMultiplier = 0.05f; - main.startColor = SetupGradient(BloodColorKeys); + main.startColor = new ParticleSystem.MinMaxGradient(BloodColorMin, BloodColorMax); shape.scale = new Vector3(6f, 6f, 6f); break; @@ -48,13 +48,20 @@ public class ParticleTrailController : MonoBehaviour case ParticleTrail.Tracer: case ParticleTrail.Tracer2: { - // Split trails, e.g. Scrag projectile + main.startLifetime = 0.5f; + main.startColor = type == ParticleTrail.Tracer + ? new ParticleSystem.MinMaxGradient(TracerColorMin, TracerColorMax) + : new ParticleSystem.MinMaxGradient(Tracer2ColorMin, Tracer2ColorMax); + + var velocityOverLifetime = effect.velocityOverLifetime; + velocityOverLifetime.enabled = true; + velocityOverLifetime.radial = new ParticleSystem.MinMaxCurve(-30, 30); break; } case ParticleTrail.SlightBlood: { main.gravityModifierMultiplier = 0.05f; - main.startColor = SetupGradient(BloodColorKeys); + main.startColor = new ParticleSystem.MinMaxGradient(BloodColorMin, BloodColorMax); shape.scale = new Vector3(6f, 6f, 6f); emission.rateOverDistance = 1.0f / (interval + 3); @@ -63,7 +70,7 @@ public class ParticleTrailController : MonoBehaviour case ParticleTrail.VoreBall: { main.startLifetime = 0.3f; - main.startColor = SetupGradient(VoreColorKeys); + main.startColor = new ParticleSystem.MinMaxGradient(VoreColorMin, VoreColorMax); shape.scale = new Vector3(16f, 16f, 16f); break; @@ -78,15 +85,6 @@ public class ParticleTrailController : MonoBehaviour transform.position = endPosition; } - private static ParticleSystem.MinMaxGradient SetupGradient(GradientColorKey[] colorKeys) - { - return new ParticleSystem.MinMaxGradient(new Gradient - { - mode = GradientMode.Blend, - colorKeys = colorKeys, - }); - } - private static ParticleSystem.MinMaxGradient SetupGradients(GradientColorKey[] minKeys, GradientColorKey[] maxKeys) { return new ParticleSystem.MinMaxGradient @@ -97,6 +95,8 @@ public class ParticleTrailController : MonoBehaviour }; } + // TODO: these colors ought to be initialized from the Quake palette instead of being hard-coded. + // That will allow them to work with custom palettes from total conversions. private static readonly GradientColorKey[] RocketColorKeys = { new GradientColorKey(new Color32(223, 171, 39, 255), 0.167f), @@ -121,15 +121,15 @@ public class ParticleTrailController : MonoBehaviour new GradientColorKey(new Color32(47, 47, 47, 255), 1.0f), }; - private static readonly GradientColorKey[] BloodColorKeys = - { - new GradientColorKey(new Color32(31, 0, 0, 255), 0.5f), - new GradientColorKey(new Color32(55, 0, 0, 255), 1.0f), - }; - - private static readonly GradientColorKey[] VoreColorKeys = - { - new GradientColorKey(new Color32(95, 51, 63, 255), 0.5f), - new GradientColorKey(new Color32(59, 31, 35, 255), 1.0f), - }; + private static readonly Color BloodColorMin = new Color32(31, 0, 0, 255); + private static readonly Color BloodColorMax = new Color32(55, 0, 0, 255); + + private static readonly Color TracerColorMin = new Color32(27, 27, 0, 255); + private static readonly Color TracerColorMax = new Color32(83, 83, 11, 255); + + private static readonly Color Tracer2ColorMin = new Color32(147, 31, 7, 255); + private static readonly Color Tracer2ColorMax = new Color32(239, 191, 119, 255); + + private static readonly Color VoreColorMin = new Color32(95, 51, 63, 255); + private static readonly Color VoreColorMax = new Color32(59, 31, 35, 255); }