Browse Source

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.
readme
Nico de Poel 5 years ago
parent
commit
eefef2097e
  1. 46
      Assets/Scripts/Support/ParticleTrailController.cs

46
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 Color BloodColorMin = new Color32(31, 0, 0, 255);
private static readonly Color BloodColorMax = new Color32(55, 0, 0, 255);
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 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);
}
Loading…
Cancel
Save