using UnityEngine; using UnityEngine.Serialization; namespace ARLocation { using Utils; /// /// This component places instances of a given prefab/GameObject along /// equally spaced positions in a LocationPath. Should be placed in /// the ARLocationRoot GameObject. /// [AddComponentMenu("AR+GPS/Place Along Path")] [HelpURL("https://http://docs.unity-ar-gps-location.com/guide/#placealongpath")] public class PlaceAlongPath : MonoBehaviour { /// /// The path to place the prefab instances on. /// [Header("Path Settings")] [FormerlySerializedAs("path")] [Tooltip("The path to place the prefab instances on.")] public LocationPath Path; /// /// The prefab/GameObject to be palced along the path. /// [FormerlySerializedAs("prefab")] [Tooltip("The prefab/GameObject to be palced along the path.")] public GameObject Prefab; /// /// The number of object instances to be placed, excluding the endpoints. That is, /// the total number of instances is equal to objectCount + 2 /// [FormerlySerializedAs("objectCount")] [Tooltip("The number of object instances to be placed, excluding the endpoints. That is, the total number of instances is equal to objectCount + 2")] public int ObjectCount = 10; /// /// The size of the sample used to calculate the spline. /// [FormerlySerializedAs("splineSampleSize")] [Tooltip("The size of the sample used to calculate the spline.")] public int SplineSampleSize = 200; public PlaceAtLocation.PlaceAtOptions PlacementSettings; public AltitudeMode AltitudeMode = AltitudeMode.DeviceRelative; [Space(4.0f)] [Header("Debug")] [Tooltip("When debug mode is enabled, this component will print relevant messages to the console. Filter by 'PlaceAlongPath' in the log output to see the messages.")] public bool DebugMode; [Space(4.0f)] private Spline spline; private Vector3[] points; private void Start() { points = new Vector3[Path.Locations.Length]; for (var i = 0; i < points.Length; i++) { points[i] = Path.Locations[i].ToVector3(); } spline = Misc.BuildSpline(Path.SplineType, points, SplineSampleSize, Path.Alpha); var sample = spline.SamplePoints(ObjectCount); for (var i = 0; i < sample.Length; i++) { var location = new Location() { Latitude = sample[i].z, Longitude = sample[i].x, Altitude = sample[i].y, AltitudeMode = AltitudeMode }; var instance = PlaceAtLocation.CreatePlacedInstance(Prefab, location, PlacementSettings, DebugMode); instance.name = $"{gameObject.name} - {i}"; } } } }