Jump to content
Unity Insider Forum

[gelöst] 3D-Würfel aus 6 Flächen, obere Seite ermitteln


Reggie()

Recommended Posts

Für eine Darstellung eines Würfelwurfes (W6) habe ich mich gegen eine Animation entschieden. Also habe ich einen Würfel aus 6 flachen cubes zusammengesetzt. Diese einem leeren GameObject (Würfel) untergeordnet. Dem GameObject habe ich noch einen rigedbody  mit Schwerkraft verpasst.

Soweit klappt auch alles, der Würfel rollt physisch. Nun will ich natürlich fürs Würfelergebnis wissen, welche Fläche oben ist. Zuerst dachte ich, ich packe einen weiteren cube ins Innere des Würfels und ermittle über die Transform.rotation welche Fläche oben sein müsste.

Wenn es klappt wäre es noch einfacher, wenn ich einfach abfrage, welche Fläche den höchsten Wert location.y hat.

Gibt es noch eine einfachere Möglichkeit?

 

Reggie()

Link zu diesem Kommentar
Auf anderen Seiten teilen

So stell ich mir das vor. die 6 Seiten sind in einem array side[6]

int maxy = 0;
int seiteObenID;
for (int i=0; i < 6; i++)
{
	int sidey = (int)side[i].transform.position.y;
	if (maxy < sidey) 
	{
		maxy = sidey;
		seiteObenID = i;
	}
}

das müsste gehen, oder? gibt es eigentlich eine array-Funktion, die den höchsten Wert ausgibt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 49 Minuten schrieb Reggie():

gibt es eigentlich eine array-Funktion, die den höchsten Wert ausgibt? 

Jap:

meinArray[meinArray.Length - 1]

Wobei du bei For-Schleifen genau aus dem Grund "<" benutzt und nicht "<=":

for (var i = 0; i < meinArray.Length; i++)
vor 49 Minuten schrieb Reggie():

das müsste gehen, oder?

Joa, aber ich würd's ehrlich gesagt so machen:

[SerializeField]
private Vector3[] sides;

public int GetNumber()
{
  int result = 0;
  var closestAngle = Mathf.Infinity;
  
  var relativeUp = transform.InverseTransformDirection(Vector3.up);
  
  for (var i = 0; i < sides.Length; i++)
  {
    var angle = Vector3.angle(relativeUp, sides[i]);
    if (angle < closestAngle)
    {
      closestAngle = angle;
      result = i;
    }
  }
  
  return result + 1;
}

Die Eigenschaft "Sides" befüllst du im Inspektor so, dass der Vektor durch die jeweilige Seite geht, wobei [0] der eins auf dem Würfel entspricht, [1] der zwei usw.

Bei Fragen gerne fragen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 17 Stunden schrieb Sascha:

 


meinArray[meinArray.Length - 1]

 

vorher noch

Array.sort(meinArray);

oder?

EDIT: Problem ist nur, dass die Reihenfolge meines Array nicht verändert werden soll. Ohne sort kann man nur über Prüfungsschleifen den höchsten Wert ermitteln? Zum Glück ist mein Array nur 6 lang

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um den größten Wert in einem int Array zu finden, kannst Du auch LINQ nutzen.

Beispiel:

//über deiner klasse LINQ einbinden
using System.Linq;

//irgendwo in deiner Funktion
var arr = new int[] { 1, 2, 3, 4, 5, 6 }; //beispiel array
var max = arr.Max(x => x); //max wert

Wenn Deine 6 Flächen einzelne Objekte sind, kannst Du auch folgendes machen. Achtung, das ist nur Pseudocode, ungetestet.

public Transform[] meineFlaechen; //da tust du deine flächen im inspector rein

Transform ObereFlaeche
{
	get
	{
		return meineFlaechen.Max(t => t.position.y); //die lambda variable t steht für das aktuelle Transform und vergleicht die Y Position aller Elemente. vom höchsten Y Wert wird dann das Transform zurückgegeben.
	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...