Tagebuch: Industry City


#153

Wie “Release” in den nächsten 7 Tagen? :open_mouth: Wann ist dass denn passiert?


#154

Ja - aber ich rede nicht vom fertigen Spiel ^^. Sondern von version 0.1.2 (welche eben das neue Map-Handling, kleine Verbesserung in der Bedienung und einen Bug-Fix enthalten soll)


#155

Her damit :blush: :raising_hand_woman:


#156

So. Mein “Weihnachtsgeschenk” ist raus. Ich hab Version 0.1.2 in den Store eingereicht :slight_smile:.


#157

Hab heute etwas festgestellt, was ich mir schon all die Zeit “gewünscht” habe. Meine Tests sahen bisher immer so aus, dass ich mir mehr oder weniger mein Prefab im Code nachgebaut hatte (was mitunter der Grund war, für so manchen internal setter).

Jetzt hab ich aber rausgefunden, wie einfach es ist meine existierenden Prefabs zu nutzen - was ja auch sehr viel besser ist! Denn somit teste ich nicht nur den Code - sondern auch ob meine Prefabs noch passen :slight_smile:.

Und alles was ich dafür machen musste, war mir diese eine kleine Hiflsmethode zu schreiben:

private static T Load<T>(string path) where T : Object {
    return Object.Instantiate(AssetDatabase.LoadAssetAtPath<T>(path));
} 

In Unity3D bekomme ich den Pfad auch sehr einfach über das Kontext-Menü. Das ist wirklich eine sehr angenehme Sache :slight_smile:.


#158

Hach. Tests sind schon etwas schönes. Gerade eben wieder gemerkt. War mir sicher: passt alles, der Test wird grün sein. Aber zur Sicherheit nochmal ausgeführt und er war rot. Grund war einfach:

set { inputSelection.gameObject.SetActive(value); }

Hier hatte ich nicht wirklich aufgepasst und anstatt “value” “true” geschrieben gehabt ^^. Schön wenn man solch kleine Bugs direkt ausmerzen kann :stuck_out_tongue:


#159

So - für meine nächste Version soll man Gebäude “Konfigurieren” können. Also im wesentlichen soll man bestimmen können, wer liefert und wer beliefert wird.

Hab eben die Funktionalität geschrieben, dass das Panel entsprechende Aufrufe verarbeiten kann. Ziel ist es, dass man über das obere Panel den Lieferanten (input) und das untere Panel das zu beliefernden (Output) angeben kann. Hier mal ein kurzes Video dazu:


#160

Mein Speichersystem bringt mich gerade etwas an den Rande der Verzweiflung. Warum: es zeigt mir die Schwächen meiner Architektur gerade auf.

Ich bin gerade einiges am Umbauen - aber ich glaube die Erkenntnis von vor eine Woche (Also das man assets in den Test laden kann) - hätte einiges an Einfluss auf meine Architektur gehabt.

So manche Entscheidung hab ich getroffen - weil es sonst schlecht zu testen wäre. Aber dadurch, dass ich fertige Assets “einfach” durch IntegrationsTests rennen lassn kann, hätte ich die gut getestet. Somit müssten nur die Services der Assets “geunittested” werden und alles wäre schön, gut, toll und wunderbar.

NUR HAB ICH DAS NICHT GEWUSST -.-

Ich mein ok: zweites Spiel. Ich hab sicherlich noch viel zu lernen (und ich würde mir einiges erleichtern, wenn ich mir Videokurse bis zu Ende anschauen würde ^^), aber trotzdem. Ich könnte mir in den Arsch treten, dass ich das damals einfach so hingenommen hab anstatt mal danach zu schauen. Und ja - ich dachte mir schon öfters, dass ich das sehr gut gebrauchen könnte :frowning:.


#161

Ich glaube ich werde jetzt erstmal wirklich weiter den Code aufräumen und separieren. Ein Problem was ich hab ist, dass die Präsentation führend ist und nicht die Logik. Sieht man auch schon daran, dass die Logik für die Map 3D-Vektoren entgegen nimmt obwohl im 2D-Bereich gearbeitet wird.


#162

Bin noch immer am Aufräumen dran. Und hab gerade rausgefunden, wie ich meinen Serializer dazu bringen kann, die Typ-Information mit zu hinterlegen. Was praktisch ist - denn nun kann ich für Straße & Co wirklich eigene Objekte haben und nicht einen einzigen generischen Typ.


#163

Ich bin mit dem Serializer immer auf die Fresse geflogen (NET1.1) und mache seit dem die Speicherung immer manuell. Das Problem damals war das er die aktuelle Version der Assembly mit gespeichert hat. Da die letzte Stelle an den Tag geknüpft ist (bzw. war), war es natürlich toll das das Einlesen am nächsten Tag nicht mehr funktioniert hatte.

Wie das jetzt mit 2.0++ ist weis ich ehrlich nicht.


#164

Kann ich nicht bestätigen - ich nutzer aber auch eine externe lib dafür ( https://www.newtonsoft.com/json ). Die kann ich auch direkt über den Unity-Asset-Store beziehen und bietet mir dann noch ein paar extras an für Unity-Klassen (z.B. Vector3).

Soweit scheint das auch wunderbar zu funktionieren (speichere das ganze im bson-Format + kleine encrypten). Solltest du noch was mit C# zu tun haben, dann kann ich dir die lib empfehlen.


Mal abgesehen von der Lib hab ich heute echt gute Fortschritte gemacht. Es gibt einige mehr tests und ich glaub ich hab auch kleine Effizienz rausgehauen. Wo ich früher immer alle x-Frames die Texte geupdated hab, passiert das nun Event-gesteuert.

Das ich da (wieder) drauf gekommen bin kam dadurch, dass ich Model- & Service-Klassen in einer eigenen Assembly hab. Und in der Assembly möchte ich möglichst wenig von Unity verwenden.

Muss das ganze jetzt mal bei Zeit bauen und auf mein Smarpthone installieren. Nur weil es im Editor läuft muss es noch lange nicht auf einem Androiden laufen ^^. Aber nicht mehr heute. Bin glücklich genug über meinen Erfolg und wills mir nicht kaputt machen :stuck_out_tongue:.


#165

Bin ich zu perfektionistisch veranlagt? Irgendwie nervt mich gerade - dass ich mich auf die Datenspeicherung so konzentriert hab + die Services. Warum erschien mir überhaupt das Speichern am Anfang als so wichtig…

Ich lasse mich davon glaub zu sehr ablenken. Irgendwie bezweifle ich, dass das Zielführend ist (auch wenn ich es von anderen Projekten so gewohnt bin) :-/


#166

Oder ich definiere das ganze noch immer als Prototyp und nutze das wissen das ich hab - um es HOFFENTLICH ENDLICH richtig zu machen.

Da ich heute noch nicht wirklich viel gegessen hab und auf mich gleich ein halbes Hähnchen wartet - werde ich mit meiner Entscheidung bis danach warten.

Aber momentan hätte ich gute Lust den Master-Branch in Prototyp umzubennen und nochmal von einem relativ frühen Stadium abzubranchen. Weil es gäbe durchaus so einige Sachen die ich schon jetzt anders machen würde.


#167

Hab mich im übrigen zu dem Schritt entschlossen und glaube es war auch gut so. Denn ich glaube TDD hat mich zu einigen falschen Entscheidungen verleitet.

Damit will ich nicht sagen, dass TDD was schlechtes wäre - nein. Es ist eine super Sache und ich bleibe auch dabei. Nur wenn man nicht wirklich weiß, wie man seine Sachen am besten testet, dann wirds wohl gefährlich. Ich glaub, damit hab ich einige Sachen unnötig kompliziert gebaut, einfach nur, weil ich nicht wusste wie ich es sonst hätte testen sollen.

Jetzt wo ich es besser weiß (geh ich einfach mal von aus) - da schaut das alles schon etwas anders aus. Zumal ich jetzt eine Absicherung hab, die ich mir schon des öfteren gewünscht hatte: ich teste meine Prefabs!

Wollen wir hoffen, dass das jetzt der letzte Restart von Industry City war :stuck_out_tongue:.


#168

Und wooohoo. Ich nutze gerade das erste mal die neuen Prefab-Variants. Somit hab ich ein Gebäude-Prefab, welches mir alles vordefiniert das jedes Gebäude haben sollte. Dann kann ich darauf basierend neue Prefabs erstlelen die spezifischer sind. Und das schöne: die sind nach wie vor miteinander verlinkt. Ändere ich was am Parent, dann bekommen das die anderen entsprechend mit :slight_smile:.

Was hinzu kommt: Genau hier hat es sich ausgezahlt, die Prefab-Tests zu haben. Denn ich musste meine bisherigen alle löschen und neu anlegen. Nun sind alle Tests grün hurray


#169

Und ich war gleich mehrfach blöd. Die Animation (welche selectierte Gebäude bewegt hat) - hatte ich hardcodiert. Warum auch immer entschied ich mich dagegen die Animationen von Unity zu nutzen. In der neuen Version nutze ich diese.

Vorteile sollten klar sein aber dennoch:

  • Ich musste keinen Code schreiben
  • Die Animation war ruck-zuck da
  • Die Animation ist sehr einfach anzupassen
  • Ich kann die Animation erweitern

Gerade der letzte Punkt: es war sehr einfach eine “fallen”-Animation hinzuzufügen. Hat keine 2min gedauert.


#170

Also ich muss sagen: ich komm gerade richtig schnell voran. Hab jetzt in der kurzen Zeit 48 tests und alles soweit, dass ich Gebäude ersetzen kann. Nur halt alles mit schöneren Animationen und meine Projekt-Struktur gefällt mir auch viel besser.

Und bisher hab ich auch glaub ganz gut umgesetzt, dass ich in Komponenten denke. Was eigentlich ganz cool ist. Z.B. das hier:

Im Prototyp hatte ich auch so ein “City”-Objekt. Das hatte nur eine Komponente “CityManager” die entsprechend alles versucht hat zu managen. CityManager wurde dann aber auch z.T. von GameManager gesteuert.

Anstatt aber jetzt eine Manager-Klasse zu haben - die dann wieder auf verschiedene Service-Klassen versucht zurückzugreifen, versuche ich es nun alles direkt in Komponenten aufzubrechen. Wie oben zu sehen. Die haben auch EINE definierte Aufgabe und das wars dann.

Und bis jetzt hab ich auch wirklich für JEDE Komponente sinnvolle IntegrationsTests! Etwas, was mit meinen vorherigem Klassenkonzept nicht möglich gewesen ist (ich wollte es gerne und hatte deswegen auch extra Tasks im Kanban-Board angelegt … aber nun ja, es war mir nicht möglich ^^).

Und das ganze betrifft mittlerweile 10 einzelne Komponenten. Gut zu sehen hier:

image

Alles was auf It endet testet entsprechend eine Prefab.


#171

Eben hab ich einen nervigen Bug gefixt. Nämlich das Gebäude nach einem Kauf/Verkauf nicht mehr animiert wurden. Das blöde: Im Editor hat es funktioniert, auf dem Handy nicht und Rider versteht sich grad mit ADB nicht - weswegen ein debuggen nicht möglich war …

Problemlösung war, dass ich die Animation besser erst einen Frame später trigger. Dann funktioniert es.

Und somit hab ich zugleich auch meinen ersten Test geschrieben, der einen gefixten Bug aus meinem Spiel fern halten soll :slight_smile:.


#172

Und wieder ein Stück weiter, denn jetzt kann man Gebäude nur noch kaufen, wenn man auch Geld hat. Das Header-Layout konnte ich einfach aus dem Prototyp-branch holen. Das hat mir den UI-Aufbau erspart :slight_smile:. Die Logik aber hab ich komplett neu geschrieben.

Den Vorteil davon werde ich auch nicht müde zu betonen: Ich hab alles mit Tests abgedeckt - vor allem mit Integrationstests.

Das Szenario von kaufen und verkaufen ist komplett abgedeckt und das find ich gerade UNGLAUBLICH COOL. Sollte hier irgendetwas brechen, dann bekomme das sofort mit :slight_smile:.