4 using System.Collections.Generic;
11 public List<Transform> Objects =
new List<Transform>();
14 public float DistributionOffset = 0f;
16 public float LengthOffset = 0f;
18 public float ScaleOffset = 0f;
20 public float ScaleMultiplier = 1f;
22 public float PositionMultiplier = 1f;
24 public float DistributionOffsetPerObject
28 return 1f / Objects.Count;
32 public AnimationCurve ObjectScale = AnimationCurve.Linear(0f, 1f, 1f, 1f);
34 public AnimationCurve ObjectPosition = AnimationCurve.Linear(0f, 0f, 1f, 0f);
36 public bool FlipRotation =
false;
38 public Vector3 RotationOffset = Vector3.zero;
40 public Vector3 PositionOffset = Vector3.zero;
46 [Header(
"Object Placement")]
53 private Transform transformHelper;
61 source = GetComponent<LineBase>();
78 if (Objects.Count == 0)
85 index = WrapIndex(index, Objects.Count);
89 index = Mathf.Clamp(index, 0, Objects.Count - 1);
92 return (1f / Objects.Count * (index + 1));
97 if (Objects.Count == 0)
106 return WrapIndex(index, Objects.Count);
110 return Mathf.Clamp(index, 0, Objects.Count - 1);
116 if (Objects.Count == 0)
125 return WrapIndex(index, Objects.Count);
129 return Mathf.Clamp(index, 0, Objects.Count - 1);
145 if (transformHelper == null)
147 transformHelper = transform.Find(
"TransformHelper");
148 if (transformHelper == null)
150 transformHelper =
new GameObject(
"TransformHelper").transform;
151 transformHelper.parent = transform;
161 for (
int i = 0; i < Objects.Count; i++)
163 if (Objects[i] == null)
168 float normalizedDistance = Mathf.Repeat(((
float)i / Objects.Count) + DistributionOffset, 1f);
169 Objects[i].position = Source.GetPoint(normalizedDistance);
170 Objects[i].rotation = Source.GetRotation(normalizedDistance, RotationTypeOverride);
172 transformHelper.localScale = Vector3.one;
173 transformHelper.position = Objects[i].position;
174 transformHelper.localRotation = Quaternion.identity;
175 Transform tempParent = Objects[i].parent;
176 Objects[i].parent = transformHelper;
177 transformHelper.localEulerAngles = RotationOffset;
178 Objects[i].parent = tempParent;
179 Objects[i].transform.localScale = Vector3.one * ObjectScale.Evaluate(Mathf.Repeat(ScaleOffset + normalizedDistance, 1f)) * ScaleMultiplier;
186 private void OnDrawGizmos()
188 if (Application.isPlaying)
197 private static int WrapIndex(
int index,
int numObjects)
199 return ((index % numObjects) + numObjects) % numObjects;
205 public class LineObjectCollectionEditor :
UnityEditor.Editor
207 public void OnSceneGUI()
211 for (
int i = 0; i < loc.
Objects.Count; i++)