Jump to content
Unity Insider Forum

Objekte sollen zusammengestellt werden


Zizi

Recommended Posts

Hallo, ich bin noch nicht sehr vertraut mit Unity und habe auch nicht große Programmierkenntnisse. Ich arbeite gerade an einem Projekt, bei dem ich aus einzelnen Legosteinen, die ich in Blender modeliert habe, eine Bank zusammenstellen muss. Die Steine liegen zu Anfang verteilt in der Spielwelt rum und müssen auf einer vorgegebenen Fläche zusammengestellt werden. Der Stein soll auf der gebenen Fläche erst abgegeben werden, wenn er zur aktuellen Ebene passt, also es sind unterschiedliche Steinformen, und wenn nicht soll eine Fehlermeldung erscheinen, dass es nicht passt. Jetzt bin ich soweit, dass ich die Steine mit der Taste E heben und ablegen kann. Aber ich habe keinen Ansatz, beim zusammenstellen der Steine. Hat da vielleicht jemand einen Tipp? Würde mich über jede Antwort freuen. Liebe Grüße.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

Ich denke, das wichtigste ist, sich bewusst zu machen, dass Computer sehr dumm sind. Du siehst zwar einen Legostein und verstehst, dass er auf den anderen Stein soll, aber der Computer rallt da gar nichts. Der sieht einfach nur, dass da irgendwie Objekte sind. Du musst also irgendeine Art von Datensatz erstellen, in dem drinsteht, was Sache ist. Dabei ist es schlau, sich an den Begriffen entlangzuhangeln, die du bereits eingeführt hast: Stein, Steinform und Ebene. Es kann auch durchaus helfen, wenn man einen Stift in die Hand nimmt und die Verhältnisse zwischen diesen Dingen in ein Diagramm malt. Eine Ebene zum Beispiel möchte eine bestimmte Menge an Steinen bestimmter Formen haben, damit sie als "abgeschlossen" gilt. Wenn sie das ist, kommt die nächste Ebene dran. Die Steine sollen dabei vermutlich nicht wahllos platziert werden, sondern an bestimmten Positionen.

Du brauchst also Code, der definiert, was eine Ebene ist: Ein Ding, das X Mal eine bestimmte Sorte Stein an einer bestimmten Position haben will. Eventuell kennt jede Ebene noch die nächsthöhere Ebene, damit sie bei der Fertigstellung quasi den Staffelstab weiterreichen kann.

Diese Definition von Dingen in der Welt findet in Unity oftmals durch Komponenten statt. Du baust also eine Ebene-Komponente, die alles das definiert, was so eine Ebene ausmacht. Könnte etwa so aussehen:

public class BuildingLayer : MonoBehaviour
{
  public struct PositionedBrick
  {
    public BrickType type;
    public Vector2 position;
  }
  
  public PositionedBrick[] requiredBricks;
  public BuildingLayer nextLayer;
}

(Anmerkung: Ist der Einfachheit wegen alles public, sollte man auf lange Sicht nicht unbedingt so machen)

Hier sind jetzt ein paar Sachen drin, die man als Anfänger vielleicht nicht unbedingt kennt. Ein "Struct" ist eine Ansammlung von Daten. Ein "PositionedBrick" besteht hier aus einem "BrickType" (das haben wir noch nicht definiert) und einer Position. Es ist also ein Datenpunkt, der sagt: "Ein Stein der Sorte X gehört an Position Y". Dann gibt's da die eckigen Klammern [ ], das definiert ein "Array", eine Ansammlung von gleichartigen Dingen; hier PositionedBricks. Stelle dir Arrays wie Listen vor (nur das "Liste" noch einmal etwas anderes ist :)). Wir haben also eine Liste von Steinsorten, die jeweils an eine bestimmte Position gehören.

Jetzt müsste man noch "BrickType" definieren. Da gibt's verschiedene Varianten. Ich zeige einfach mal die enum-Variante, obwohl das nicht mein Favorit wäre. Ist aber schön einfach.

public enum BrickType
{
  Grey4x4, GreySlope4x4, GreySlope4x4Inverted, BrownPlateModified
}

Da kannst du in die Liste reinschreiben, was du willst. Für jeden Steintyp eine Bezeichnung. Wenn du so ein enum dann als Typ benutzt, kann man im Editor eine der Werte auswählen:

grafik.png

Wir bauen also noch eine Komponente, die auf jeden Stein kommt (oder erweitern, was du schon hast):

public class Brick : MonoBehaviour
{
  public BrickType type;
}

Jetzt baust du erstmal eine Ebene mit der BuildingLayer-Komponente und richtest die ein. Dafür klappst du das Array im Inspektor aus und stellst eine Zahl ein. Nehmen wir einfach mal 2, damit die Ebene 2 Steine haben will. Dann trägst du in die beiden Elemente des Arrays Steintyp und Position ein. Ist natürlich nicht ganz optimal, dass man das so blind mit Zahlen machen muss, aber wenn man das schöner haben will, wird der Code gleich viel komplizierter.

Dann müsste man als nächstes einbauen, dass die Ebene Bescheid bekommt, wann immer ein Stein abgelegt wird, damit sie schauen kann, ob der richtige Stein abgelegt wurde. Da muss man mal in den Code schauen, den du zum Ablegen bereits hast. Hast auf jeden Fall noch ein bisschen was vor dir :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...