actually catmull splines and bezier curves are probably the easiest method to go about this. there's plenty of plugin's that can provide this kind of functionality.
take a look at the leantween plugin, it's great, and you could wrap it into a scriptable object:
[link]https://www.assetstore.unity3d.com/en/#!/content/3595
this plugin allows you to define paths, and you could read them out in your code, to get the waypoints. then simply iterate over them.
edit: Here's an example of code, set up to create an instance of an LTSpline on a gameObject:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
public class PathSpline : MonoBehaviour{
public Color color;
[HideInInspector]
public Vector3[] splinePoints;
[HideInInspector]
public LTSpline spline;
public Vector3[] localPts;
int i,j;
[ExecuteInEditMode]
void Start(){
j = 0;
GameObject parent = this.gameObject;
//Vector3[] localPts = new Vector3[splinePoints.Length];
if (localPts.Length > 2) {
System.Array.Resize (ref splinePoints, localPts.Length);
}
for (j = 0; j < localPts.Length; j++) {
if(parent.transform.TransformPoint(localPts[j]) != splinePoints [j]){
splinePoints[j] = parent.transform.TransformPoint(localPts[j]);
}
}
if (splinePoints.Length >= 4) {
System.Array.Resize (ref spline.pts, splinePoints.Length);
spline = new LTSpline (splinePoints);
//System.Array.Resize (ref spline.ptsAdj, splinePoints.Length);
//spline.ptsAdjLength = splinePoints.Length;
}
}