using System; using UnityEngine; namespace VOID.Generic.Trajectory { [Serializable] public abstract class AbstractTrajectory { public Vector3 startPosition { get; protected set; } public Vector3 endPosition { get; protected set; } public float lineDistance { get; protected set; } public float trajectoryDistance { get; protected set; } public AbstractTrajectory Clone() { return MemberwiseClone() as AbstractTrajectory; } /// /// Initialize (again) whole trajectory. /// public void Init(Vector3 startPosition, Vector3 endPosition) { this.startPosition = startPosition; this.endPosition = endPosition; lineDistance = Vector3.Distance(startPosition, endPosition); trajectoryDistance = lineDistance; OnInit(); } /// Position on trajectory, by given distance (in line) public Vector3 GetPositionByDistance(float distance) { return GetPositionByProgress(GetProgressForDistance(distance)); } /// Progress (0-1) to end position, by given distance (in line) public virtual float GetProgressForDistance(float currentDistance) { return Mathf.Clamp01(currentDistance / lineDistance); } /// Whole trajectory path with given number of points public Vector3[] GetPositions(int count) { var positions = new Vector3[count]; var step = 1f / (count-1); for (var i = 0; i < count; i++) positions[i] = GetPositionByProgress(i * step); return positions; } protected abstract void OnInit(); public abstract Vector3 GetPositionByProgress(float progress); } }