Tagebuch: Game Jams

So. Da ich nun ja hauptsächlich kleinere Projekte machen möchte, hier mal ein neuer Thread. Mein aktuelles Projekt ist World Snake und da kam vieles zusammen, was ich in der Vergangenheit gelernt hab.

Ohne große Worte hier einfach mal ein Video welches das GamePlay zeigt:

Release werde ich es spätestens morgen (Win/Linux/Mac).

Ich halte es für mein bestes Spiel bisher und überlege, ob ich eine Android-Version davon machen soll.

P.S.: Am Montag (27.4) hatte ich mit dem Spiel begonnen (was auch das Erstellen der 3D-Modelle beinhaltet).

1 Like

Ich muss sagen, ich bin echt begeistert von dem Spiel. Ich hab auf Twitter 2 Tweets dazu abgesetzt und die schlagen alles - was Industry City an Aufmerksamkeit erreicht hatte.

Morgen werde ich mir mal anschauen, wie gut ein Android-Port funktioniert. Außerdem hoffe ich, dass ich eine Web-Version veröffentlichen kann. Leider hatte ich damit mit einem anderen Spiel heftigste Probleme, welche ich nicht gelöst bekommen hatte. Aber einen Versuch kann man ja mal starten.

Ok. Während ich versucht habe einen Web-Build zu machen wurde mir klar, warum ich vermutlich keine Android-Version erstellen kann.

Alle Zielplattformen (afiak außer PCs) müssen AOT unterstüzten. Ich hab mir für Bolt aber eine Unit geschrieben, die das nicht unterstützt:

‚JFruit.Bolt.OnUnityEvent::OneParamHandler<System.Int32>‘ for which no ahead of time (AOT) code was generated.

Dafür etwas zu generieren ist auch unmöglich. Denn der Typ wird zur Laufzeit generiert. Es gäbe vermutlich unendlich viele Kombinationsmöglichkeiten.

Ich zweifle auch mal sehr stark an, dass ich dafür eine Lösung finden werde. Gedanken werde ich mir trotzdem mal noch ein paar dazu machen. Aber ich hab keine wirkliche Hoffnung. Denn ich glaube entweder muss ich auf die Unit verzichten - oder auf Android/Web. Denn ich hab kaum Möglichkeiten, die Unit anders zu verwenden.

World Snake ist eingereicht (und somit auch released) :slight_smile:. Ich hoffe es kommt gut an.

ICH HABS TATSÄCHLICH GELÖST BEKOMMEN!!!

Und es war letztendlich nicht einmal so schwer. Zudem hab ich es mit sehr wenig code geschafft. Das Problem an sich wird hier erläutert: https://docs.unity3d.com/Manual/ScriptingRestrictions.html

Was auch sehr gut mein Problem beschreibt. Ich habe eine generische Methode, die für den Compiler einmal aufgerufen werden muss. Also hab ich die Methode von private-scope auf public scope geändert und eine neue Basisklasse für Events eingeführt. Somit muss ich nur von dieser Erben, damit ich AoT-Support habe.

Also anstatt:

public class IntEvent : UnityEvent<int> { }
hab ich nun
public class IntEvent : AotUnityEvent<int> { }

und alles funktioniert :slight_smile:

Die AotUnityEvents sind auch relativ simpel:

Und das wars. Nun funktioniert alles :slight_smile:

Ok. Hab jetzt mal spaßeshalber die mobile Steuerung eingebaut und das ganze mal auf meinem Androiden deployed.

Und was soll ich sagen: Es läuft :slight_smile: und zwar sehr gut sogar!

Einem Android-Port steht also nichts im Weg :slight_smile:

Hmm. Tatsächlich scheint gerade das komplizierteste das GUI zu sein. Ich würde das auf dem Android gerne etwas anders haben.

Ich bin mir jetzt nur noch nicht sicher, wie ich das mache. Aber ich glaube ich muss tatsächlich zwei verschiedene Versionen davon pflegen.

:smile:

Ich hatte das mal versucht die QBasic-Variante in AmigaBasic auf einem A500 umzusetzen. Nein, der A500 hatte nicht mal annähernd die CPU-Power um es wie in QBasic zu machen. Musste mir dann eine eigene Variante für das auflösen des Schlangenschwanzes machen.

Anschließend habe ich noch Geschwindigkeiten eingebaut: je langsamer man spielte, um so länger wurde man beim Fressen. Also statte ein Feld länger, eben (z.B.) 5 Felder.

Wobei mir der auch ganz schöne Problem anfangs gemacht hat. Ursprünglich wollte ich es so bauen, dass dir die Aliens folgen. Das war aber alles andere als einfach. Die sind überall hingelaufen nur nicht dahin wo sie sollten. Irgendwann bin ich drauf gekommen, dass ich einen/mehrere Pfade generieren müsste. Aber auch damit war das Ergebnis alles andere als zufrieden stellend. Irgendwann kam mir dann die Idee: spawn die Aliens an Ort uns Stelle und gut ist.

Auch eine interessante Idee. Ich ziehe ja einfach punkte pro Sekunde ab. Irgendwie muss man ja einen Anreiz schaffen, dass der Spieler weiter macht.
Ich glaub ich hab bei meiner Variante noch nie länger als 1:35 oder so überlebt. Aber dadurch das ich Punkte verlier und möglichst viel haben möchte, kommt mir es vor als ob die Zeit viel schneller vergeht. Ganz oft das ich dachte: „Jetzt müsstest du an der 2min-Marke sein“ und war dann bei 30 oder 40 Sekunden ^^.

Sieht richtig gut aus, gefällt mir! :slight_smile:

Wie heißt du dort? Der hier ist es nicht, oder? :smiley:

EDIT: Ok, gefunden, ich Fuchs :see_no_evil:

1 Like

Danke :slight_smile:

Dabei hab ich mich doch so gut getarnt ^^ … und ich weiß nicht, was ich von dem Tomatensalat halten soll. Zum einen: sehr unkreativer Name und zum anderen ist das verdammt nah an meinem dran. Ich wusste, ich hätte den als Marke eintragen lassen sollen :frowning:

So. Es gibt ein neues Update (was vermutlich auch das letzte ist). World Snake hat nun eine Highscore und man kann die Drehgeschwindigkeit vom Spieler verändern. Dafür bekommt der Spieler in den Einstellungen nun 3 Voreinstellungen zur Verfügung:

  • Normal (standard)
  • Fast
  • Very Fast

Das Update gilt für alle Plattformen: web, win, mac, linux und android.

Letzteres muss aber erst noch durch den review-prozess. Ich hoffe, das Google direkt die letzte Version reviewed und nicht die von gestern und dann die von heute. Ich fände es gut, wenn das Spiel direkt in der aktuellen Version released wird :slight_smile:.

Hier nochmal der Link zum Spiel: https://tomate-salat.itch.io/world-snake

Ich wünsche viel Spaß :slight_smile:

Ging doch schneller als 7 Tage :slight_smile: :

Bin mittlerweile an einem neuen Game-Jam dran. War mir nicht sicher, ob ich da teilnehmen sollte. Denn er hat eine gemeine Restriktion: Source Code öffentlich machen.

Das Problem ist nicht der öffentliche Source-Code. Das Problem resultiert eher daraus. Denn öffentlicher Source-Code bedeutete auch: keine gekauften assets verwenden! Somit kann ich Bolt nicht einsetzen. Und ohne Bolt, kann ich meine eigene JFruit-Lib nicht einsetzen.

Also hab ich mir gedacht, ich gucke mal weiter. Hab auch 2 weitere Jams gefunden, die für sich auch interessant waren. Einer vor allem deswegen, weil die Juroren jedes Spiel im Live-Stream spielen und kommentieren. Hätte mich mega interessiert was jemand zu meinem Spiel sagt. Aber basierend darauf den Jam auswählen? Irgendwie schon - immerhin geht es ums Feedback. Aber ich bin mir sicher: solche Jams kommen immer wieder. Und wenn ich so an meine Spiele denke? World Snake hätte ich gerne im Live Stream gesehen. Doginx hingegen - muss nicht wirklich. Rawbot wäre auch nett gewesen, aber nur wenn der Stream es bis Ende spielt.

Aber egal - ich hatte zum Schluss also 3 Jams vor mir und nach kurzer Zeit vergessen, welcher der mit dem Stream war. Musste ich wieder suchen, hab ihn gefunden und endgültig entschieden: Davon mach ichs nicht abhängig.

Wie ich es einleitend schon gespoilert hab: ich hab mich für den ersten entschieden. Warum? Aus 2 Gründen:

  1. Ich fand das Thema „Zeit“ war das interessanteste von allen. Und ich hatte das Gefühl da was bauen zu können
  2. Die Tatsache, dass ich keine weiteren Jams angeschaut hätte - wenn Bolt erlaubt wäre.

Nein. Punkt zwei ist tatsächlich ein Pro-Argument und kein Kontra. Warum? Ganz einfach: meine Tools sollten mich unterstützen und ich sollte nich Abhängig von Ihnen sein. Außerdem sehe ich es als Möglichkeit an, meine JFuit-Lib aufzuräumen.

So. Ich bin jetzt schon seit vorgestern dabei und habe heute in der Mittagspause etwas gemacht, wovor es mir immer gekraut hatte. Partikel Systeme. Nicht, dass ich die nicht toll fände - ich kann sie nur nicht benutzen. Deswegen hab ich bisher auch viel Abstand zu denen gehalten. Aber man will ja was lernen. Und hier das Resultat meiner Mittagspause:

So. Ich drück mich gerade etwas vorm nächsten Partikeleffekt, deswegen schreib ich mal hier ein update ^^.

@TMII hat mir den Tipp gegeben, die Partikeleeffekte beim Laden zu verändern und das hab ich auch genau so übernommen. Schaut definitiv besser aus.

Zudem können die Gegner nur Schaden nehmen. Wie viel Effekt der Schuss hatte, sieht der Spieler in Form von Zahlen die über dem Gegner auftauchen. Je mehr Schaden in Relation zu den verbleibenden HP gemacht wurde, desto roter die Textfarbe. Und ich überlege noch, ob ich dem Spieler die verbleibenden HP überhaupt anzeigen soll. Irgendwie möchte ich nicht so wirklich, dass er es weiß. Vllt auch ein Kompromiss: der Spiele sieht die Lebenspunkte nur von dem Gegner, über dem die Maus steht.

Des weiteren verlieren die Kugeln jetzt nach jeder Kollision die hälfte Ihres Schadens.

Das ganze könnt Ihr hier schon sehen :slight_smile::

Hab richtig guten Fortschritt heute gemacht. Der Kern vom Spiel steht schonmal. Dabei hab ich heute bisher folgendes eingebaut:

  • Partikeleffekte für Explosionen (Spieler und Bomben)
  • Cache-System für Gegner (so kann ich die GameObjects wiederverwenden und Unity muss diese nicht bei jedem Spawn neu erstellen)
  • Spieler kann sterben
  • Systeme schalten sich ab wenn Spieler tot
  • SpawnSystem: zwar nicht neu, aber ziemlich stark überarbeitet. Vor allem werden die Gegner nun an Ihrem finalen Platz erstellt.
  • Und eben das im Post über diesem Post)

Natürlich ist ein Video immer am besten. Deswegen könnt Ihr hier das ganze in Action sehen :slight_smile:

So. Ich hab mal wieder nette Fortschritte gemacht. Ich hab relativ viel Zeit gebraucht selber eine StateMachine zu designen. Dabei hab ich mehrere Konzepte gebaut und zwei sind auch zum Einsatz gekommen. Aber nicht parallel. Ich hatte erst eine und dachte ich wäre damit zufrieden gewesen. Aber es war mir zu sehr ein Proxy.

Deswegen musste ich das ganze nochmal Umsetzen. Und die StateMachine kommt von der Funktionsweise sehr nahe an das Prinzip von Bolt ran (natürlich ohne irgendwas visuelles). Aber es fühlt sich von der Arbeitsbeweise her ziemlich gleich an. Darum bin ich damit auch sehr zufrieden.

Des weiteren hab ich heute mein Lightning-Problem behoben. Ich wollte schon einmal meine Scene besser beleuchten und nachdem ich die meine Lichter „gebacken“ hatte, war alles dunkel. Ich hab es nicht hell bekommen. Das Problem war zwar einfach zu lösen - aber nicht einfach zu finden. Es lag letztendlich einfach daran, dass meine 3D-Modelle keine sinnvollen UVMap haben. Also sie macht schon Sinn für die Textur - aber die UVs sind halt absolut unbrauchbar für LightMaps und Shader. Glücklicherweise kann Unity zusätzliche UVMaps automatisch erstellen. Das hat letztendlich mein Problem mit der Beleuchtung gelöst :slight_smile:.

Zu guter letzt hab ich heute dann noch ein paar PostProcessing Effekte dazu gepackt und bin recht zufrieden mit dem Ergebnis bisher. Auch wenn ich glaub noch am PostProcessing schrauben werde ^^.

Oh - und bevor ichs vergesse. Am Hauptmenü hab ich auch noch ein paar Sachen umgestrickt.

Wie immer gilt: Video > Text. Also hier auch ein Video zu dem aktuellen Stand:

Hab mich die Tage um Musik und Einstellungen gekümmert. Heute kam dann noch die Spiel-Statistik hinzu.

Außerdem hab ich noch einen weiteren Post-Process-Effekt eingebaut. Damit wirkt das ganze noch ein wenig surrealer. Und ich find surreal passt sehr gut zu meiner Spielidee :slight_smile:.

Das es damit doch schon wieder einiges zu Zeigen gibt, hab ich direkt mal ein neues Video aufgenommen.

Also hier diesmal ein Video mit Ton: https://youtu.be/QSeFfhaDxb0

Was sagt mehr aus als ein Video? Richtig: ein Spiel. Hab heute morgen noch ein schönes intro-erklärungsvideo eingebaut :slight_smile:.

Das Spiel findet ihr hier:

Ich wünsche viel Spaß :slight_smile:

P.S.: Ich schaffs nicht weiter als lvl 4. Wäre interessant zu hören, ob hier jemand mehr packt :slight_smile:


Ach ja. Die sourcen findet ihr hier: https://github.com/tomate-salat/keep-your-memory

erste Runde
image

ich würde noch eine Hover für die Buttons vorschalgen - ansonsten verdammt gute arbeit

1 Like