Jump to content
Unity Insider Forum
Reggie()

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

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()

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites
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.

  • Like 1

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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.
	}
}

 

  • Like 1

Share this post


Link to post
Share on other sites
vor 3 Stunden schrieb Reggie():

vorher noch


Array.sort(meinArray);

oder?

Nö.

Share this post


Link to post
Share on other sites
meinArray[meinArray.Length - 1]

gibt doch nur das letzte Element und nicht das Element mit dem höchsten Wert ?!

Share this post


Link to post
Share on other sites

Ach, so meinst du das. Hatte das anders verstanden, weil du oben auch die 6 hardcoded hattest. Wenn's darum geht... was @devandart schrieb.

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×