/// <summary> /// Calcula el punto mas cercano de la nave a una curva /// </summary> /// <param name="curve">Curva a calcular el punto mas cercano</param> /// <returns>Indice del punto mas cercano en el ScriptableObject</returns> public int CalculateNearestPoint(CurveScriptObject curve) { return(curve.qTree.NearestNeighbor(transform.position).DataNode.Data); }
/// <summary> /// /// </summary> /// <param name="curve"></param> public void SetCurve(CurveScriptObject curve) { path = curve; iTargetIndex = CalculateNearestPoint(curve); vTargetPoint = path.points[iTargetIndex]; }
public override void OnInspectorGUI() { base.OnInspectorGUI(); GUILayout.Label("Separation"); separation = Mathf.Abs(EditorGUILayout.FloatField(separation)); GUILayout.Label("Precision step"); prec_step = Mathf.Abs(EditorGUILayout.FloatField(prec_step)); maxBound = EditorGUILayout.Vector2Field("Tree TL Corner", maxBound); minBound = EditorGUILayout.Vector2Field("Tree TL Corner", minBound); //Boton para crear scriptable object de curva if (GUILayout.Button("*honk* *honk*")) { float actDist = 0; List <Vector2> points = new List <Vector2>(); int segment = 0; float t = prec_step; Vector2 handler1 = curve.GetPointsInSegment(segment)[1]; Vector2 handler2 = curve.GetPointsInSegment(segment)[2]; Vector2 anchor1 = curve.GetPointsInSegment(segment)[0]; Vector2 anchor2 = curve.GetPointsInSegment(segment)[3]; Vector2 prevpoint = BezierInt.CubicBezier(anchor1, handler1, handler2, anchor2, 0); Vector2 actpoint; while (segment < curve.NumSegments) { handler1 = curve.GetPointsInSegment(segment)[1]; handler2 = curve.GetPointsInSegment(segment)[2]; anchor1 = curve.GetPointsInSegment(segment)[0]; anchor2 = curve.GetPointsInSegment(segment)[3]; actpoint = BezierInt.CubicBezier(anchor1, handler1, handler2, anchor2, t); float distbet = (actpoint - prevpoint).magnitude; actDist += distbet; if (actDist >= separation) { points.Add(actpoint); actDist = 0; } if (t + prec_step > 1) { segment += 1; // Parte fraccional del nuevo step t = (t + prec_step) - Mathf.Floor(t + prec_step); } else { t += prec_step; } prevpoint = actpoint; } // Agrega el ultimo segmento si es una curva cerrada if (curve.isClosed) { handler1 = curve.points[curve.points.Count - 2]; handler2 = curve.points[curve.points.Count - 1]; anchor1 = curve.points[curve.points.Count - 3]; anchor2 = curve.points[0]; t = 0; actDist = 0; while (t < 1) { actpoint = BezierInt.CubicBezier(anchor1, handler1, handler2, anchor2, t); float distbet = (actpoint - prevpoint).magnitude; actDist += distbet; if (actDist >= separation) { points.Add(actpoint); actDist = 0; } t += prec_step; prevpoint = actpoint; } } // Elimina duplicados adyacentes for (int i = 0; i < points.Count - 1; i++) { if (points[i] == points[i + 1]) { points.RemoveAt(i + 1); i -= 1; } } CurveScriptObject final = ScriptableObject.CreateInstance <CurveScriptObject>(); final.CreateCurve(points.ToArray(), curve.isClosed, null); AssetDatabase.CreateAsset(final, "Assets/curva.asset"); AssetDatabase.SaveAssets(); } }