2016-08-01 14 views
3

Ich entwickle ein C# -Skript auf Unity 5.3. Ich habe eine Liste von Vector2-Werten und ich muss den größten X-Wert in der Liste extrahieren. Ich versuche, die folgendes zu tun:Unity 5.3 - C# - Liste <Vector2> Wie wird der größte X-Wert extrahiert?

public List<Vector2> Series1Data; 
... //I populate the List with some coordinates 
MaXValue = Mathf.Max(Series1Data[0]); 

Allerdings bekomme ich folgende Fehler:

error CS1502: The best overloaded method match for `UnityEngine.Mathf.Max(params float[])' has some invalid arguments 
error CS1503: Argument `#1' cannot convert `UnityEngine.Vector2' expression to type `float[]' 

Gibt es eine andere Art und Weise der Extraktion des größten X-Wert in der Liste?

+0

Sie wahrscheinlich wie diese könnten versuchen: int xMax = Single.MinValue; foreach (Vector2-Vektor in Series1Data) { if (Vektor.X> xMax) { xMax = Vektor.X; } } – Roman

+0

Vielen Dank, ich werde es sofort versuchen @RomanSidorov – xrr

Antwort

2

Sie versuchen zu setzen a Liste für eine Funktion, die diesen Variablentyp nicht als Parameter haben kann.

Mathf.Max Hier können Sie sehen, welche Art von Parametern es verarbeiten kann.

Dieser Code könnte die Arbeit machen:

public List<Vector2> Series1Data; 
... //I populate the List with some coordinates 

MaXValue = Series1Data[0].x; //Get first value 
for(int i = 1; i < Series1Data.Count; i++) { //Go throught all entries 
    MaXValue = Mathf.Max(Series1Data[i].x, MaXValue); //Always get the maximum value 
} 
+0

Das hat gut funktioniert, und ich muss keine Werte definieren. Vielen Dank! – xrr

0

Sie versuchen, den maximalen Vektor selbst mit Ihrem Code zu erhalten, stattdessen möchten Sie den maximalen x-Wert des Vektors erhalten - das ist ein float anstelle eines Vektors; versuchen, diesen Code:

public List<Vector2> Series1Data; 
//I populate the List with some coordinates 
MaXValue = Mathf.Max(Series1Data[0].x); 

EDIT:

Ich habe erkannt, dass die Mathf.Max() Funktion eine Reihe von Schwimmern als Parameter - Sie brauchen die ‚x‘ Wert trennen schwimmt von der Vektor; vielleicht funktioniert das folgende:

public List<Vector2> Series1Data; 
//I populate the List with some coordinates 
float[] xCoordinates = new float[Series1Data.Count] 
for(int i = 0; i < Series1Data.Count; i++) 
{ 
    xCoordinates[i] = Series1Data[i].x; 
} 
MaXValue = Mathf.Max(xCoordinates); 
2

Sie können dies über Linq tun:

MaxXValue = Series1Data.Max(v => v.x); 

Dies setzt voraus, Sie Series1Data List-Objekt ist nicht null oder leer.

2

Sie könnten wahrscheinlich wie diese versuchen:

float xMax = Single.MinValue; 
foreach (Vector2 vector in Series1Data) 
{ 
    if (vector.X > xMax) 
    { 
    xMax = vector.X; 
    } 
} 
0

Ihr Problem liegt in der Tatsache, dass Sie ein List<> vom Typ sind vorbei Vector2 wenn Mathf.Max() eine array vom Typ float nimmt. Statt Ihren Code, so etwas tun:

public Vector2[] Series1Data; 
public float[] Series1DataX; 
... //Populate Series1Data with data like this: Series1Data[number] = data; 
... //Populate Series1DataX with data like this: Series1DataX[number] = data.x; 
MaXValue = Mathf.Max(Series1DataX); 

So haben Sie zwei Arrays: ein Array, das alle Vector2 s und speichert man, dass die Vector2 s X-Werte speichert.

0

Verwenden Sie wie folgt.

MaXValue = Mathf.Max(Series1Data[0].x);

Ursache des Fehlers, Series1Data [] ist vector2 und MaxValue ist Schwimmer. Es ist ein Typkonversionsfehler. Und Sie wollen X-Wert von Series1Data [].

Um den maximalen Wert aus der Liste zu erhalten, müssen Sie alle x Werte durchlaufen und den größeren Wert mit dem nächsten vergleichen und das aktuelle Maximum ersetzen, wenn es größer ist.

Oder Sie können sort die Liste aufsteigend und erhalten die ersten Indexwerte als max.

0

Unity Mathf.Max funktioniert nur mit float Arrays Sie eine temporäre Array mit allen machen kann schwimmt es

using UnityEngine; 
using System.Collections.Generic; 

public class LelExample : MonoBehaviour 
{ 
    public List<Vector2> Vec2List = new List<Vector2>(); 
    public float maxX; 

    public void Start() 
    { 
     float[] x; //set temp arrays 
     float[] y; 

     GetArraysFromVecList(Vec2List, out x, out y); //set the arrays outputting x and y 

     maxX = Mathf.Max(x); //Max the x's 
    } 
    public void GetArraysFromVecList(List<Vector2> list, out float[] x, out float[] y) //My Custom Void 
    { 
     float[] tx = new float[list.Count]; //Define temporary arrays 
     float[] ty = new float[list.Count]; 

     for (int i = 0; i < list.Count; ++i) 
     { 
      tx[i] = list[i].x; //Add x to each corrosponding tx 
      ty[i] = list[i].y; //Add y to each corrosponding ty 
     } 
     x = tx; //set the arrays 
     y = ty; 
    } 
} 

Hoffnung zu lösen das funktioniert :) ~ Sid