/// <summary> /// Spawns prefabs along the spline. /// </summary> public void GeneratePrefabsAlongSpline() { if (!prefab || !spline) { return; } float length = spline.GetTotalLength(); int count = (placementStyle == PlacementStyle.Distance) ? Mathf.FloorToInt(length / spacing) : instanceCount; float currSpacing = (placementStyle == PlacementStyle.Distance) ? spacing : ((spline.GetTotalLength() - 0.05f) / instanceCount); for (int i = 0; i < count; i++) { if (spawnedObjects.Count <= i || spawnedObjects == null) { spawnedObjects.Add(Instantiate(prefab, transform)); } float dist = (i + 1) * currSpacing; Transform t = spawnedObjects[i].transform; t.position = spline.GetPointOnSplineByDistance(dist); if (lookForward) { t.rotation = Quaternion.LookRotation(spline.GetDerivativeByDistance(dist), Vector3.up); } } for (int i = spawnedObjects.Count - 1; i >= count; i--) { GameObject g = spawnedObjects[i]; spawnedObjects.RemoveAt(i); DestroyImmediate(g); } }
/// <summary> /// Snaps GameObject to spline at specified distance. Rotates the object is LookForward is true. /// </summary> /// <param name="d">Distance along the spline.</param> private void MoveAlongSpline(float d) { transform.position = spline.GetPointOnSplineByDistance(d); if (lookForward) { transform.rotation = Quaternion.LookRotation(spline.GetDerivativeByDistance(d), Vector3.up); } }