Jump to content
Unity Insider Forum

objekte mit der maus anwählen


louis12356

Recommended Posts

Hallo,

 

meine Aufgabe ist es im moment, ein kleines Mahjongg Spiel in Unity zu programmieren. Leider habe ich noch nicht so viel mit unity gearbeitet, was für mich einige probleme auf den weg bringt.

 

Ich habe bereits alle steine des Mahjonggs angeordnert und möchte diese, wenn die szene aufgerufen wird, dass die texturen sich random ändern (zunächst einmal nur farben). wie bewerkstellige ich soetwas ? die logik habe ich, ja, aber mir fehlt der syntax in unity. Gelernt habe ich nun ein jahr lang die Grundlagen von C#. ansprechen kann ich meine steine mit "stein1 = GameObject.Find("stein1");", aber wie muss ich weitermachen ? ich brauch ja eine schleife in der ich den steinen die farbe bzw die textur zuweise, aber mir fehlt der syntax. kommt das ganze dann in die start oder update function ? außerdem muss ich die steine nachher noch miteinander vergleichen können. da habe ich die logik auch. aber syntax fehlt :/ Kann mir da vielleicht jemand ein kleines beispiel geben ? im internet finde ich nichts...

 

dazu kommt noch, dass ich die steine anwählen kann, maximal 2

 

 

Gruß, Louis

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hinweis: Bin selber Anfänger, kann also auch gut sein, dass ich hier nur Mist schreibe. Trotzdem möchte ich es versuchen (bitte korrigieren wenn ich Müll von mir gebe) ;)

 

Ich würde mir erstmal eine Liste mit den Steinen erstellen. In etwa sowas:

 

List<GameObject> steinListe = new List<GameObject>();

 

in der Start- oder Awake-Funktion dann alle Objekte mit dem Tag "Stein" in die Liste speichern:

 

void Start() {
  GameObject[] tempSteine = GameObject.FindGameObjectsWithTag("Stein");
  foreach(GameObject go in tempSteine) {
  steinListe.Add(go);
  }
}

 

Du kannst dann normal (auch in der Start-Funktion) einmal über die Liste iterieren und Ihnen die Zufalls-Farbe/Textur zuordnen.

 

Wie gesagt, keine Garantie dass das so funktioniert, bzw. es gibt bestimmt auch noch elegantere Möglichkeiten als meine hier genannte, aber da können die Pros hier bestimmt was zu sagen :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

was genau ist "go" in deiner foreach ?

 

"go" ist einfach ein selbst gewählter Variablenname -> steht sicherlich für GameObject...

Eine foreach -Schleife durchläuft einfach eine IEnumerable Objekt-Liste. Du kannst auch eine for-Schleife benutzen, und mit "steineListe" auf die einzelnen GameObjects zugreifen.

 

Hier der MS-Link für die generische List<> http://msdn.microsof...v=vs.90%29.aspx

und foreach http://msdn.microsoft.com/de-de/library/ttw7t8t6.aspx

Link zu diesem Kommentar
Auf anderen Seiten teilen

wir haben es geschafft, die "steine" in eine array zu bekommen. Nun möchten wir in einer schleife die textur der einzelnen steine ändern. allerdings klappt das nicht so ganz, da wir anscheinend keinen renderer auf den steinchen haben.

irgendwie muss ich ja auf die 3 meshes zugreifen, die meine steinchen haben (siehe foto). oder soll ich mir ein neues gameobjekt schaffen, also andere steinchen, die einen einzelnen mesh haben ?

 

gruß

post-4974-0-05604000-1411042391_thumb.jpg

post-4974-0-35600900-1411042391_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Darf ich zuerst einmal auf ein wenig Lektüre verweisen? http://forum.unity-community.de/blog/3/entry-91-skriptkommunikation-in-unity/

Ich empfehle, sich die Benutzung von Tags nicht allzusehr anzugewöhnen. Für ein Mahjong-Spiel mag's okay sein, aber irgendwann greift das Konzept plötzlich nicht mehr, und dann sitzt man in der Tinte.

 

Für das neue Problem empfehle ich, dass jeder Stein ein Skript auf dem Hauptobjekt hat (was, wenn ihr meinen Blogeintrag beherzigt, sowieso der Fall sein wird), welcher in Awake ein Mal das Ergebnis von GetComponentInChildren<Renderer> abspeichert. Dann kann zum Ändern eine Funktion in diesem Skript stehen, die etwa so aussieht:

public void ChangeTexture(Texture2D texture)
{
 foreach(var r in rendererDieInAwakeGefundenWurden)
 {
   r.material.mainTexture = texture;
 }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

das mit dem umfärben hat soweit geklappt, nun muss ich aber die steine auswählen können. ich habe mir überlegt, mit raycast zu arbeiten, erscheint mir aber auf den ersten blick sehr umständlich. gibt es eine andere methode ? ich muss nur je 2 bools miteinander vergleichen, damit ich sagen kann, ob das pärchen aufgeht. jemand eine idee ??

 

gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Woah, warte. Mixt du da nicht gerade mehrere Probleme?

Steine auswählen geht mit Raycast, aber da Unity sowieso schon ständig Raycasts macht, kannst du auch die nutzen und den Steinen einfach ein Script mit OnMouseDown geben:

void OnMouseDown()
{
 print("Ich wurde angeklickt!");
}

 

Was ist da jetzt mit 2 bools und Pärchen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn ich mit onmousedown arbeite, muss ich ja irgendwie 2 steine miteinander vergleichen können. Je ein Stein soll 2-3 bools haben, die ich auslesen können muss, denn nicht jeder stein kann mit einem anderen aufgesammelt werden. wie kann ich die steine in einem skript ansprechen oder wie kriege ich die werte ?

 

gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

irgendwie weiss ich nicht wie ich das verpacken soll... über onmousedown krige ich ja die aktuelle mausposition, den soll raycast ja nutzen, um seinen strahl abzuschießen, aber ich krig es nicht hintereinander. auch weiss ich nicht, wie ich dann informationen aus den beiden "gameobjecten" auslesen kann. ich habe für diese lösung noch 2 tage zeit, danach muss ich das spiel abgeben.

 

kann mir da vielleicht jemand etwas helfen ?

 

Gruß, Louis

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deine Stein-Objekte benötigen ein Script, in dem du z.Bsp. deine Bools speicherst. Sowas wie "bool isSelected" o.ä.

 

Wenn du, wie von Sascha schon gepostet, die Methode "void OnMouseDown()" in diesem Script verwendest, kannst du dort dann den bool ändern:

 

void OnMouseDown() {
  Debug.Log("Ich wurde angeklickt...");
  isSelected = !isSelected;
}

 

Da jeder Stein dieses Script hat, wird die OnMouseDown() auch nur für den Stein aufgerufen, der angeklickt wurde!

 

In der Update-Methode (von deiner Steinverwaltung) kannst du dann durch deine Steine iterieren, schauen welche Steine ausgewählt sind (also die Bools abfragen) und ggf. weiteren Code ausführen (Steine entfernen, o.ä.).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du benutzt static. Hier hast du ein paar Grundlagen darüber.

 

Ersetze "Spielstein" durch den Namen des Scripts, um das es hier gerade geht.

static Spielstein clicked;

void OnMouseDown()
{
 if(!clicked) //wenn noch keiner angeklickt ist
 {
   clicked = this; //dann merke dir "diesen" (also den gerade angeklickten) Stein
 }
 else //sonst
 {
   ComparePieces(clicked, this); //vergleiche den zuletzt angeklickten Stein mit diesem, also dem aktuell angeklickten
   clicked = null; //vergiss anschließend den zuvor angeklickten, um ein beim nächsten auswählen neues Pärchen zu bilden
 }
}

static void ComparePieces(Spielstein a, Spielstein 
{
 //hier kannst du jetzt nach belieben die beiden Spielsteine a und b vergleichen
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...