Aufbau der 2048-Spiel in Unity über C # und Visual Studio - Dimitris-Ilias Gkanatsios
Wie immer können Sie den Quellcode hier auf GitHub finden und das Spiel hier über WebGL testen.

Screenshot zeigt das Spiel im Editor Unity. Auf der linken Seite können wir die Partitur und ein Restart-Taste, auf der Mitte der Hauptspielbildschirm und auf der rechten Seite eine Visualisierung des Spiels 2-dimensionalen Array-Inhalt, für Debugging-Zwecke zu sehen.
Eingabeverfahren
Wir haben zwei Methoden implementiert, um Benutzereingaben in dem Spiel zu bekommen. Erstens ist über Tastatur Pfeiltasten, die andere über Swipe in einem Touch-Screen (oder Maus). Wir haben eine Aufzählung implementiert Benutzereingabe und eine Schnittstelle zu erhalten, die von jeder Eingabemethode implementiert werden muß wir nutzen wollen. Darüber hinaus, wenn wir brauchen eine andere Eingabemethode in Zukunft hinzuzufügen, z.B. Eingabe von einem XBOX Controller können wir einfach den IInputDetector-Schnittstelle implementieren.
Verfahren erkennt, wenn eine Pfeiltaste gedrückt wird, und gibt die entsprechende Richtung. Beachten Sie, dass wir verwenden GetKeyUp Methode, da wir nicht mehrere Eingänge pro Pfeiltaste drücken haben wollen.
Die Methode, um die Richtung über Swipe komplizierter. Lassen Sie uns den Code in Teilen sehen:
Wir haben eine einfache Aufzählung den Zustand des Swipe zu halten. Hat er gestartet worden ist oder nicht?
Wir verwenden einige Felder uns bei der Umsetzung zu helfen. Die maximale Swipe Dauer beträgt 1 Sekunde und das Minimum ist 100 Millisekunden.
Berührt der Benutzer (oder klickt mit der Maus) auf den Bildschirm, beginnen wir mit dem Swipe-Prozess.
Wenn der Benutzer das Ziehen abgeschlossen ist, prüfen wir, ob die Dauer der Drag os innerhalb der gewünschten Fristen ist. Wenn dies der Fall ist, haben wir den Winkel des Swipe über die Vector2.Angle Methode zu finden. Wir verwenden auch die Vector3.Cross Methode (berechnet das Kreuzprodukt), um die Richtung des differenceVector zu bestimmen.
Globals-Klasse enthält statische Variablen über Zeilen, Spalten und AnimationDuration.
ItemMovementDetails
Die ItemMovementDetails Klasse wird verwendet, Details zu einem Objekt zu tragen, die im Begriff ist, bewegt zu werden, und / oder dupliziert. Die NewRow / NewColumn Eigenschaften enthalten die Informationen des Standorts des Elements in dem Array, während die GOToAnimateScale und GOToAnimatePosition Eigenschaften Informationen über die Objekte im Spiel enthalten, die im Begriff sind, zu bewegen und / oder skaliert werden. Der normale Prozess ist ein Element zu bewegen (seine Position ändern), aber wenn dieses Element mit einem anderen fusionieren, dann wird dies auch seine Skala geändert hat (und verschwindet dann). Mehr dazu in Kürze!
Die Item-Klasse ist ein einfacher.
- Die Value-Eigenschaft enthält den Wert des Elements (z 2,4,8,16, etc.)
- Row und Column Eigenschaften enthalten die jeweiligen Zeilen- und Spaltenwerte des Arrays, dass dieser Punkt zu belonds
- Die GO-Eigenschaft enthält einen Verweis auf die Unity Gameobject Dieser Punkt bezieht sich auf
- Der WasJustDuplicated Wert enthält Informationen, ob dieses Element in dieser Bewegung / Swipe dupliziert wurde.
Diese Methode holt einen nicht null Element im Array. Es wird verwendet, um ein neues Element nach jedem Swipe zu erstellen.
Diese Methode wird nach jedem Streichen genannt und setzt alle WasJustDuplicated Werte auf false gesetzt.
Diese Methode überprüft, ob zwei Objekte als Argumente weitergegeben (über die Spalten- / Zeilenindexierungs) haben den gleichen Wert. Zunächst wird geprüft, ob die übergebenen Indizes außerhalb der Grenzen sind. Dann prüft sie, ob das Element in dieser Array Position nicht null ist und wenn es nicht nur dupliziert wurde (das heißt, es wurde nicht nach dem aktuellen Swipe dupliziert). Wenn alle diese Prüfungen wahr sind, dann
- wir verdoppeln den ersten Wert Punkt und stellen Sie die WasJustDuplicated Feld auf true
- wir haben das zweite Element aus dem Array entfernen, nachdem wir einen Verweis darauf, in Ordnung zu halten, es zu animieren
- wir eine neue Instanz der ItemMovementDetails Klasse zurückgeben, die Informationen des Elements trägt seine Position und die Position animiert hat seine Skala animierte zu haben (und am Ende verschwinden).
In Bezug auf die Bewegung der Elemente des Benutzers Swipe nach, haben wir verschiedene Szenarien, die wir abdecken müssen. Denken Sie daran, dass null Elemente im Array leere Räume darstellen.
c) 2 | 2 | X | 2 => 4 | 2 | X | X. Ersten beiden ‚2‘ werden zusammengeführt haben, und das dritte wird auf die zweite Säule bewegen
d) X | 2 | 2 | 2 => 4 | 2 | X | X. Gleiche Situation wie vorherige Option. Ersten beiden ‚2‘ werden zusammengefasst, verschoben zu der ersten Spalte und der dritten ‚2‘ ist mit der zweiten Spalte verschoben.
Diese Methode verschiebt das Element an der Stelle, wo es angenommen hat, zu gehen (auf Wertprüfungen basiert). Er ordnet das Element an die neue Position und „Vorteile zunichte macht“ das alte. Außerdem prüft sie, ob das Element neben den gleichen Wert hat. Wenn dies der Fall ist, stellen wir diese Informationen zurückgeben während, wenn sie anders sind nur wir Einzelheiten der Artikel zurück, die verschoben wurde.
Hier haben wir unsere Schleife beginnen. Natürlich werden wir alle Zeilen überprüfen. Dann durchlaufen wir alle Spalten, die Indizes aus der columnNumbers Liste nehmen. Während jede Zeile durchlaufen, überprüfen wir zunächst die einzelnen Elemente für null. Wenn es null ist, fahren wir fort, den nächsten Punkt überprüft (durch die nächste Spalte überprüft -. Nächste Mittel entweder -1 oder 1, abhängig von dem Durchzug Wenn wir eine Nicht-Null-Spalte erreichen, überprüfen wir, ob diese Spalte das gleiches wie das ist eine daneben. Wieder „neben“ bedeutet entweder -1 oder 1, je nachdem, ob das Streichen nach links oder rechts ist. Wenn diese Elemente gleich sind, dann fügen wir diese Informationen an die movementDetails Liste und weiterhin die Schleife in der nächste Spalte.
Wenn diese Elemente nicht gleich sind, dann müssen wir das Element bewegen wir derzeit in der dann die ersten Nullposition verweisen. Für einen links Streich, wenn das Element [Zeile, Spalte] ist, dann ist die einzig möglichen Positionen sind aus [Zeile, 0] bis [Zeile, Spalte-1], daher müssten wir die ersten Spalt Elemente aus der columnNumbers Liste. Für eine richtige Swipe, die einzig möglichen Positionen sind aus [Reihe, Globals.Columns-1] bis [Zeile, Spalte + 1], so müssen wir die ersten Globals.Columns - Spalte Elemente aus der umgekehrten columnNumbers Liste. Wir führen eine Schleife in diesen Spalten (das 'Take LINQ Methode) einen Verweis auf jede Spaltenzahl zu halten (über die columnFirstNullItem Variable) und überprüft jedes Element, wenn es null ist. Wenn wir einen finden, verlassen wir die Schleife.
Wenn wir nicht einen Nullpunkt finden, dann das aktuell referenzierte Element ist in der richtigen Position, so lassen wir es wie es ist. Wenn wir das tun, dann bewegen wir die zur Zeit in die Nullstellung referenzierte Element und wir erstellen eine Instanz der Klasse ItemMovementDetails, um Animationsinformationen zu tragen. Am Ende der MoveHorizontal Methode, wir geben die movementDetails Liste, die Informationen für alle Animationen enthält, die durchgeführt werden müssen.
Utilities-Klasse enthält zwei statische Methoden, nützlich für das Debuggen. Lassen Sie uns zahlen ihnen einen Besuch
So erhöht sich die Spalte auf der rechten Seite und der Reihe auf der Unterseite. Das unterscheidet sich von der Einheit Richtung, so dass wir kehren sich die Reihen Schleife visuell genau zu sein.
Dies ist ein ähnliches Verfahren wie ich früher, als ich den Match-3-Spiel-Mechanismus entwickelt. Es lädt eine Datei „debuglevel“ aus dem Ordner Ressourcen genannt. Die Datei enthält ganze Zahlen (die die Positionswerte darstellen) und X (die die Nullwerte darstellen). Wir verwenden das Rohr ( ‚|‘ |) als Trennzeichen. Methode gibt ein zweidimensionales Array Zeichenfolge, die den Inhalt der Datei enthält.
GameManager
Dieses Verfahren wird verwendet, um die Anordnung über die Informationen, die von dem erhaltenen GetMatrixFromResourcesData zu schaffen, die zuvor beschrieben wurde.
Die Initialize-Methode wird aufgerufen, entweder, wenn das Spiel beginnt oder dann der Spieler berührt die Schaltfläche Neu starten. Erstens zerstört sie alle vorhandenen Gegenstände im Spiel. Dann initialisiert das Array, erstellt zwei neue Objekte und initialisiert Partitur und gameState Variablen.
Die CreateNewItem Methode wird ein neues Element auf dem Array zu erzeugen. Es wird entweder zu Beginn des Spiels oder nach jedem Benutzer Swipe verwendet. Wie Sie sehen können, hat es optionale Argumente. Diese erlauben es dem Anrufer das Verfahren auf unterschiedliche Weise aufzurufen, abhängig von der gewünschten Funktionalität der Funktion.
Wenn Zeilen- und Spalten Argumente null sind, bedeutet dies, dass wir das Produkt in einer beliebigen Position platziert werden sollen. Wenn sie nicht null sind, bedeutet dies, dass wir das Niveau über die premade-Datei im Ordner Ressourcen debuggen. Gleiche steht für das Wertargument, mit Ausnahme der Tatsache, dass dies entweder einen Wert aus der premade Ebene haben werden oder den Wert 2 (Standardwert für neue Objekte) haben.
Das Verfahren erzeugt eine neue Instanz der Item-Klasse ordnet die richtigen Felder, um es instanziiert eine neue Gameobject basierend auf dem Elementwert und animiert seine Skala über die ausgezeichnete GoKit Animation / Tween-Bibliothek. Am Ende weist es die neue Element-Instanz an die richtigen Stelle in der Element-Array.
Die InitialPositionBackgroundSprites Methode erzeugt einen neuen Hintergrund-Sprite für all Array-Positionen.
In der Update-Methode, überprüfen wir, ob der Benutzer uns jede Eingabe gegeben hat. Wenn dies der Fall ist, führen wir die im Zusammenhang Swipe und sammeln die movementDetails Liste, alle möglichen Animationen enthalten, die ausgeführt werden müssen. Wenn diese Liste mindestens ein Element hat, dann cal wir das Animieren Elemente-Methode.
Die AnimateItems beginnt, indem durch die movementDetails Liste Looping. Dann animiert sie jedes Element in seine neue Position in der Welt Raum.
Wenn der aktuelle Eintrag in der Liste movementDetails einen Nicht-Null-Wert im GOToAnimateScale Feld hat, bedeutet dies, dass das Objekt bewegt wird, und dann verschwinden. So aktualisiert das Verfahren die Partitur und überprüft den neuen, duplizierten Wert. Ist dies zu 2048 gleich ist, bedeutet dies, dass das Spiel beendet ist. Wenn nicht, werden wir die duplizierte Element zu erstellen, machen es zu klein und es in die richtige Position in dem Array zuweisen.
Das Element, das zusammengeführt wird und dupliziert wird a) bewegt und dann b) verschwinden. Um dies zu tun, müssen wir zwei Animationen in der Kette passieren, eine Bewegungsanimation und eine Skala Animation. Wir schaffen ein neues GoTweenChain Objekt, das uns diese beiden Animationen ausführen können. Wir beginnen diese Animation und wir fügen die beiden Gameobjects, die dem objectsToDestroyList verschmolzen wurden. Wir haben dann CreateNewItem. rufen WaitForSeconds über die Ausführung zu halten, bis alle Animationen und dann Schleife durch die objectsToDestroy Liste zu zerstören alle unnötigen Gameobjects gestoppt haben. Der Grund, warum wir diese Liste verwenden, weil wir diese Gameobjects zerstören wollen nicht sofort, da die Animationen nicht ausgeführt werden.
Die UpdateScore Methode aktualisiert nur die Partitur und zeigt sie auf dem Bildschirm, während die GetGOBasedOnValue Methode ein bestimmtes Fertig in Reaktion auf den Wert Argument zurückgibt. Beispielsweise für einen Wert 2, kehrt das Verfahren den Fertiggameobject für den Wert 2.