/// <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];
 }
Exemplo n.º 3
0
    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();
        }
    }