4 using System.Collections.Generic;
12 const int RandomValueResolution = 1024;
14 public List<Transform> Objects =
new List<Transform>();
22 [Header(
"Noise Settings")]
23 public float ScaleMultiplier = 10f;
24 public float SpeedMultiplier = 1f;
25 public float StrengthMultiplier = 0.5f;
26 public Vector3 AxisStrength = Vector3.one;
27 public Vector3 AxisSpeed = Vector3.one;
28 public Vector3 AxisOffset = Vector3.zero;
30 private Vector3[] prevPoints;
31 private System.Random randomPosition;
32 private System.Random randomRotation;
35 [Header(
"Swarm Settings")]
37 public float NormalizedDistance = 0f;
39 public Vector3 SwarmScale = Vector3.one;
41 public AnimationCurve ObjectScale = AnimationCurve.Linear(0f, 1f, 1f, 1f);
43 public AnimationCurve ObjectOffset = AnimationCurve.Linear(0f, 0f, 1f, 0f);
47 public bool SwarmVelocities =
true;
49 public float VelocityBlend = 0.5f;
51 public Vector3 RotationOffset = Vector3.zero;
53 public Vector3 AxisScale = Vector3.one;
61 source = GetComponent<LineBase>();
77 Vector3 randomPoint = Vector3.one;
78 randomPoint.x = (float)randomPosition.Next(-RandomValueResolution, RandomValueResolution) / (RandomValueResolution * 2);
79 randomPoint.y = (float)randomPosition.Next(-RandomValueResolution, RandomValueResolution) / (RandomValueResolution * 2);
80 randomPoint.z = (float)randomPosition.Next(-RandomValueResolution, RandomValueResolution) / (RandomValueResolution * 2);
82 return Vector3.Scale(randomPoint, SwarmScale);
101 if (prevPoints == null || prevPoints.Length != Objects.Count)
103 prevPoints =
new Vector3[Objects.Count];
106 randomPosition =
new System.Random(Seed);
107 Vector3 linePoint = source.
GetPoint(NormalizedDistance);
108 Quaternion lineRotation = source.
GetRotation(NormalizedDistance, RotationTypeOverride);
110 for (
int i = 0; i < Objects.Count; i++)
112 if (Objects[i] == null)
117 Vector3 point = source.transform.TransformVector(GetRandomPoint());
118 point.x = (float)(point.x + (noise.
Evaluate((point.x + AxisOffset.x) * ScaleMultiplier, Time.unscaledTime * AxisSpeed.x * SpeedMultiplier)) * AxisStrength.x * StrengthMultiplier);
119 point.y = (float)(point.y + (noise.
Evaluate((point.y + AxisOffset.y) * ScaleMultiplier, Time.unscaledTime * AxisSpeed.y * SpeedMultiplier)) * AxisStrength.y * StrengthMultiplier);
120 point.z = (float)(point.z + (noise.
Evaluate((point.z + AxisOffset.z) * ScaleMultiplier, Time.unscaledTime * AxisSpeed.z * SpeedMultiplier)) * AxisStrength.z * StrengthMultiplier);
122 Objects[i].position = point + linePoint;
125 Vector3 velocity = prevPoints[i] - point;
126 Objects[i].rotation = Quaternion.Lerp(lineRotation, Quaternion.LookRotation(velocity, Vector3.up), VelocityBlend);
130 Objects[i].rotation = lineRotation;
132 Objects[i].Rotate(RotationOffset);
134 prevPoints[i] = point;
A conglomeration of open-source simplex libraries in C# with an emphasis on performance ...
double Evaluate(double x, double y)