public void ComputePositions() { positions.Clear(); directions.Clear(); if (!HasFormation()) { return; } Vector3 right = transform.right; Vector3 forward = transform.forward; Vector3 up = transform.up; Vector3 position = transform.position; for (int i = 0; i < members.Count; i++) { var member = members [i]; if (member.IsNewPath(firstPath)) { member.ResetProgress(); } float currentProgress = member.GetCurrentPathProgress(); Vector3 pathPosition = firstPath.GetPoint(currentProgress); Vector3 pathDirection = firstPath.GetDirection(currentProgress); right = Vector3.Cross(Vector3.up, pathDirection); up = Vector3.Cross(pathDirection, right.normalized); forward = pathDirection; Vector3 formationTranslation = currentFormation.GetMemberPosition(member.Index, forward, right, up); groupRotation *= Quaternion.AngleAxis(Time.deltaTime * rotationSpeed, pathDirection); formationTranslation = groupRotation * formationTranslation; Vector3 finalPosition = pathPosition + formationTranslation; Debug.DrawRay(finalPosition, right * 2f, Color.green); Debug.DrawRay(finalPosition, up * 2f, Color.red); Debug.DrawRay(finalPosition, forward * 2f, Color.blue); member.IncreasePathProgress(firstPath); positions.Add(finalPosition); directions.Add(forward); } }