Tagebuch: Feature Runner

Um das ganze mal “In Action!” zu zeigen — und wie cool das jetzt auch über die Controller steuerbar ist, hier ein kurzes Video:

1 „Gefällt mir“

Ich hab mittlerweile ein wenig an dem Hauptmenü “designed” und im wesentlichen steht auch das neue Design:

Das neue Design kommt jetzt mit einer Toolbar. Diese enthält: Zurück-button, Münzen, Werte vom letzten run und einen App-Beenden-Button.

Zurück-Button
Dieser wird nur angezeigt, wenn man sich in einem Untermenü befinde (z.B. Statistiken). Ansonsten wird er ausgeblendet sein. Auf dem Screenshot ist er deswegen eingeblendet weil es erstmal nur um die Positionierung geht und die Logik zur Anzeige fehlt.

Werte-Anzeige
Mein bester Kumpel hat mich darauf hingewiesen, dass die Werte (Distanz/Meter) sehr essentiell sind. Deshalb werden mit dem neuen Design immer zumindest im Hauptmenü angezeigt. Während des Spiels wird es nach wie vor das Feature geben.

Beenden-Button
Um etwas Platz in der Höhe zu gewinnen hat dieser seinen Platz nun in der Toolbar gefunden.

Menü Panel
Hier befinden sich die ganzen Buttons die entweder zu anderen Panels führen oder eben das Spiel starten. Derzeit finden sich dort noch 2 Shops (Shop & Power Ups). Es kommt auf den Aufwand drauf an was einfacher ist: diese vorerst noch getrennt zu lassen oder beide Shops in einem Panel anzuzeigen (letzteres ist das was ich langfristig anpeile. Um das nächste Update so schnell wie möglich zu veröffentlichen weiß ich jetzt aber noch nicht, welchen Weg ich gehen werde).

Wie Ihr seht sind die Werteanzeige (Münzen, Reichweite und Punkte) sowohl im Hauptmenü als auch im Spiel gleich. Gleiche Position, gleiche Daten — es würde sich anbieten hier das ganze als ein Panel anzubieten und zu nutzen. Derzeit existiert das ganze 2x (einmal in Game Ui und einemal in Menu Ui). Das zusammen zu bekommen stellt sich als tükisch heraus - warum: weil ich wohl die gleichen Fehler gemacht hab wie bei meinen anderen Managern zuvor auch. Ich denke in Unity noch zu sehr mit Fokus auf „Alles läuft in einer Komponente ab“ anstatt sowas wie Service-Klassen zu nutzen. Aber immerhin wirds mir langsam klar ^^.

Also werde ich vermutlich nochmal meine Game-Ui-Logik anpassen dürfen. Danach dürfte ich dann aber hoffentlich eine zufrieden stellende Architektur haben :slight_smile:.

Zusammen mit dem obigen sollte ich auch vielleicht einfach erstmal das komplette UI durch designen bevor ich mit dem Manager anfange.

Bin jetzt z.B. an den Statistiken dran und getreu dem Gedanken „We want MORE!“ diese etwas erweitert. Zuvor hab ich nur einen Teil der Statistiken angezeigt - einfach aus Platzgründen. Habe mich jetzt mal etwas mit dem Scrollview und Layoutmanagern (hab rausgefunden, dass es die hier auch gibt :slight_smile:) auseinandergesetzt. Nun wird das (nach aktuellem Stand) so aussehen:

Das schöne: die Statistiken werden bereits vom Spiel gesammelt. Nur angezeigt wurden diese nicht. Wenn das also fertig ist, könnt Ihr direkt die neuen Statistiken bewundern :slight_smile:.

Und ich hab mich diesbezüglich dann auch entschieden. Wenn ich schon ander UI rumfummle, dann kann ichs auch gleich richtig machen! Also werden die Shops gemergt:

Und an der Stelle hab ich echt die LayoutManager zu schätzen gelernt. Was ich vorher selbst gecoded hab bekomme ich auf einmal geschenkt :slight_smile:.

Oh mann, ich merk gerade wie einfach so manche Dinge gelöst werden können. Anfangs hatte ich mir Buttons selber programmiert anstatt auf fertige Komponenten zurückzugreifen. Hinzu kommt, dass mir diese eine super einfache Möglichkeit bieten, listener zu registrieren:

image

Hier gebe ich einfach den Ui-Manager an (unten links) und oben rechts wähle ich die Methode von diesem aus. ShopPanel hat einen Parameter, welchen ich unten rechts definiiere. Das erspart mir mind. 5 zusätzliche Methoden.

Btw für die die es interessiert, ShowPanel schaut so aus:

public void ShowPanel(GameObject panel) {
    _backButton.SetActive(true);
    _mainMenuPanel.SetActive(false);
    
    panel.SetActive(true);

    _currentPanel = panel;
}

Damit erspare ich mir so einiges an Code und es funktioniert einfach. Die einzelnen Panels anzusteuern war damit super einfach und schnell realisiert!

So. Da ich heute vermutlich nicht mehr all zu viel geschafft bekomme, möchte ich gerne nochmal ein Video posten, was den aktuellen Stand zeigt:

Ich denke am GUI wird sich jetzt nicht mehr viel ändern. Es muss halt noch funktional gemacht werden. Aber im wesentlichen sind alle Sachen vorbereitet :slight_smile:.

Den UI-Manager vom letzten Video hab ich allerdings komplett weg geschmissen und neu gemacht. Hab das Gefühl, da einfach nicht alles richtig gemacht zu haben. Die jetzige Variante fühlt sich einfach besser an. Zumal ich (wie oben erwähnt) nun auch mehr die Unterstützung von Unity3d an sich nutze :slight_smile:.

Ich habe mich die letzten Tage auch zusätzlich etwas mehr mit Code-Qualität & Co auseinander gesetzt. Was mich an C# am meisten stört ist das fehlende package-private. Alles was ich dazu finden konnte war „nutze internal“. Internal arbeitet aber nicht auf package (bzw. namespace)-Ebene, sondern auf Assemblies (z.B. Dll). Um das zu bewerkstelligen, müsste ich also mein Projekt in Assemblies aufteilen.

War (mit einem dummy projekt) erstaunlich einfach oO. Das muss ich halt noch in mein Spiel übertragen - aber sollte kein Problem sein. Was ich damit erreichen will ist auch sehr einfach erklärt:

Mein derzeitiges konkretes Beispiel wären meine Models. Diese sollten ausschließlich nur durch Services verändert werden können. D.h. die getter davon sollen public sein und die getter internals. Somit kann ich gewähren, dass nur sinnvolle Operationen auf den Models statt finden, da dies durch meine Services passieren muss. Und die Services sind ja alle durch Unit Tests sehr stark abgesichert!

Desweiteren hab ich mich auch für Integrationstests interessiert und fest gestellt, was ich schon wusste: Sie helfen mir dabei, meine Controlls & Co sinnvoll zu designen. In einem Dummy-Projekt (Selbes von vorhin ^^) hab ich mir dazu mal einen einfachen Setup aufgebaut:

  • AccountModel: beinhaltet wie viel Gold ein Spieler besitzt
  • AccountService: kann Gold hinzufügen
  • GoldLabel: Soll den Wert aus dem Model darstellen.

Das ganze natürlich abgesichert durch einen IntegrationTest :wink:

Das Controll zum Testen:

[ExecuteInEditMode]
[RequireComponent(typeof(Text))]
public class GoldLabel : MonoBehaviour {       
    public AccountModel AccountModel;

    private Text _text;

    private void Start() {                        
        _text = GetComponent<Text>();
    }

    private void Update() {
        if (AccountModel == null) return;
        
        _text.text = "Gold: " + AccountModel.Gold;
    }
}

Der Test

[UnityTest]
public IEnumerator GoldLabelRendersCorrectly() {
    var go = new GameObject();
    var model = ScriptableObject.CreateInstance<AccountModel>();
    var service = new AccountService(model);
    
    var label = go.AddComponent<GoldLabel>();
    var text = go.GetComponent<Text>();
    
    label.AccountModel = model;                                                          
    yield return null;            
    Assert.AreEqual("Gold: 0", text.text);

    service.AddGold();
    yield return null;                       
    Assert.AreEqual("Gold: 1", text.text);
    
    
    service.AddGold(2);
    yield return null;            
    Assert.AreEqual("Gold: 3", text.text);
}

Erklärung dazu:
Es wird ein GameObject erstellt (Name ist Programm. GameObjects können in der Scene dargestellt werden. Das kann sowohl ein einfaches TextFeld sein als auch eine Waffe oder sonst was). Diese GameObject bekommt die Komponente GoldLabel hinzugefügt. GoldLabel an sich hat definiert, dass auf es eine Text-Komponente benötigt um zu funktionieren. Darum erstellt mir Unity automatisch auch eine solche Text-Komponente auf dem GameObject.

yield return null; macht nichts anderes als dafür zu sorgen, dass die GameLoop weiter geht bis zum nächsten Update. (Es wird also „gespielt“ :wink:).

Nach jedem Update prüfe ich also, welcher Wert im Textfeld steht und erhöhe meinen Gold-Betrag über den Service. Woraufhin ich nach dem darauffolgenden Update erwarte, dass der Wert im TextFeld angepasst wurde.

War jetzt für dieses Beispiel sehr einfach und angenehm umzusetzen. Ich hoffe, dass meine Komponenten alle gut testbar sind. Hätte ich von Anfang an solche Tests geschrieben, dann wären Sie es mit Sicherheit.

's geht vorwärts. Hab jetzt meine Assemblies drin und tests für das Controll was die Power Ups im Store anzeigt. Ach ja: der Store ist somit auch erstmal fertig:

Als nächstes gehts dann an die Highscore :stuck_out_tongue:

So - ich denke das nächste Update könnte dann noch diese Woche kommen :slight_smile:.

Mit dem Hauptmenü bin ich fertig (sofern mir kein Bug mehr auffällt). Es fehlt also „nur noch“ das Game-Ui während dem Spiel. Und auch hier hab ich schon angefangen. Dank der neuen Art und weise wie ich meine Komponenten schreibe ging einiges auch relativ flott - da ich das Zeug wieder verwenden konnte :slight_smile:.

Für heute mach ich aber Feierabend. Merke so langsam, dass ich nicht mehr ganz so viel Wert auf Tests lege wie noch vor einigen Stunden.

Und zum Thema tests: Viele Komponenten sind jetzt auch tatsächlich getestet. Zu den 55 Unit-Tests sind jetzt mittlerweile 12 Integrationstest dazu gekommen :slight_smile:.

So. Ich hab ein neues Update im Store eingereicht - die Win-version findet ihr wie immer hier:

https://1drv.ms/u/s!Av4-trM0Vnk9tybTQfqeveVSdVrr

So. Ich hab auch schon eine Planung für die nächsten zwei (Ja ihr lest richtig: ZWEI!) Versionen! Mit denen erhoffe ich mir einige Münzen wieder aus dem Spiel nehmen zu können, indem ich Sachen liefere, die Ihr kaufen könnt.

Das Motto der Versionen:

Level & PowerUp-Cleanup
Zum einen möchte ich hier die Level nochmal etwas überarbeiten. Aber auch die Power Ups. Das PowerUp „Increase Speed“ macht z.B. ja überhaupt keinen Sinn mehr. Daraus aber etwas sinnvolles zu gestalten war relativ einfach. Es macht nämlich in Zukunft das Gegenteil! Es verlangsamt das Level. Und zwar um 25% der Geschwindigkeit. Außerdem möchte ich den 3ten PowerUp-Slot nun auch endlich mal umsetzen. Und zwar soll es ein Schild-Power-Up geben.

Zusätzlich kam mir noch eine Idee: Es steht ja auch schon länger das Element „Skills“ im Raum, wo mir einfach die Ideen zu fehlen/gefehlt haben. Was ich mir mal als Idee aufgenommen hab ist, dass man das PowerUP DecreaseSpeed skillen kann (und zwar die Verlangsamung). Für Highscore-Jäger dürfte das nämlich durchaus interessant sein. Sobald das Level zu schnell wird haut man eine Bremse rein. Damit kann man sicherlich noch einige Meter extra bekommen :slight_smile:.

Btw: In dem Zuge hab ich den Preis auch erhöht, von 20 auf 50 Münzen.


Die darauf folgende Version steht unter dem Moto:

Skills
Es wird vermutlich ein größeres Update werden! Es hat jetzt schon 10 Tasks in der Planung die ich alle heute neu erstellt hab! Und nein: die Idee mit der Skillung von DecreaseSpeed ist da (noch) nicht dabei! Es geht auch in eine Richtung - die so afair hier noch nie angesprochen wurden. Insofern: lasst euch überraschen, was ich damit geplant hab :slight_smile:.

1 „Gefällt mir“

Ich war es schon immer leid: Wenn ich einem Panel vom Hauptmenü was ändern musste, dann durfte ich Panel A deaktivieren nur um Panel B zu aktivieren. Und später natürlich alles wieder zurück. Hab mich jetzt endlich mal dazu durch gerungen ein eigenes EditorWindow dafür zu schreiben. Und was soll ich sagen: es funktioniert Prima. So werden automatisch alle Panels mit der Komponente MenuPanel gefunden und mir als Buttonliste angezeigt. Jetzt drück ich nur noch auf ein Panel drauf und zack … es wird sichtbar :smiley::


höhö, konnte es weiter verbessern. Nun sehe ich was aktiv ist + ich kann die Tabs vom Shop ändern:

1 „Gefällt mir“

So. Neues Update eingereicht:

  • Levelgenerator überarbeitet
  • Increase-Speed Powerup durch Decrease-Speed ersetzt. Ihr könnt also einmal im Spiel die Runde um 25% verlangsamen.
  • Neues Powerup: Schild.

Windows-Version hat ebenfalls das Update erhalten :slight_smile:.

Das nächste Update wird vermutlich aber etwas länger dauern.

WoW. Ich hab tatsächlich mal eine Parabel berechnen müssen oO. Hätte nie gedacht, dass die Warnung von den Mathe lehrern mal Wirklichkeit wird xD

Mich würde echt mal interessieren was du eigentlich die letzten Jahre so gemacht hast. :smiley:
Auf keinen Fall böse gemeint: Ich finde es amüsant wie ein doch langjähriges erfahrenes Mitglied sich plötzlich an Spiele Designs probiert und eben solche Erfahrungen sammelt. Sind doch viele Programmierer eben über Spiele erst zu ihrem Studium gekommen.
Darunter fallen auch viele deiner Entwicklungsschritte und Erfahrungen die du dabei gemacht ist.

Das du „erst jetzt“ mit einer Parabel in Verbindung kommst wundert mich aber dann doch schon ein bisschen. Sowohl in anderen Projekten aber vorallem bei der Spieleprogrammierung.

All das ist keine Kritik, und auch nicht in irgendeiner Form wertend gemeint.
Ich fande es nur erwähnenswert, deshalb lese ich deine Beiträge immer sehr gerne. :slight_smile:

Nun ja - weder mathematische Formeln entwickelt noch Spiele programmiert. Gerade letzteres ist ein rein privates Vergnügen von mir. Aber wenns dich wirklich interessiert:

  • Ich war in einer Softwareschmiede tätig die in der Weinwirtschaft angesiedelt ist. Dort hab ich hauptsächlich C++ gemacht und später kam dann Java hinzu (Server & Android-Entwicklung).
  • Und seit einigen Jahren bin ich mittlerweile bei Tipico (wo ich derzeit auch nur mit Java arbeite und zum Glück kein C++ mehr :slight_smile:). Dort aber auch mit Schwerpunkt Frontend.

Dankeschön :slight_smile:. Bin mir nicht sicher, wieviele hier noch (wenigstens) mitlesen ^^. Aber da Tagebuch führe ich auch gerne einen Monolog :smiley:

Ich lese noch halbwegs jeden 2. Beitrag mit hier. :slight_smile: Tipico gefällt mir, beim Spiel vorhin lag ich richtig. :wink:

Gestern auf heute war unsre kleine Nichte mal wieder zur Übernachtung hier. Da bin natürlich zu nichts gekommen… vor allem weil sie es gepackt hat mit ihren gerade mal 2 Jahren mich ins Bett zu schicken (zeigt aufs bett, ich leg mich drauf. Dann holt sie die Fernbedienung für die elektrischen Rolläden, macht sie runter geht ausm Zimmer und macht die Tür hinter sich zu. Nun ja - ich bin liegen geblieben und eingeschlafen).

Da ich heute aber wenigstens noch ein klein wenig was machen wollte, hab ich zumindest mal meine Aufgaben auf die nächsten Milestones aufgeteilt. Das gute daran ist: ich sollte nur noch 3stk haben bis ich alles (mir) wichtige im Spiel habe:

Gleichzeitig bin ich mal noch so manches nice-2-have durchgegangen und hab dort auch mal aufgeräumt. Manches davon werde ich vielleicht doch umsetzen. Manches hab ich in ähnlicher Form anders geplant.

Auf jeden Fall werde ich mir nach Milestone 32 (UI Stuff) überlegen, ob ich das Spiel aus der Beta-Phase rausnehme und es offiziell releasen werde.

1 „Gefällt mir“

Kleines Update: Ich bin seit heute morgen an den Services dran. Zum einen brauchte ich einen neuen und einen bestehenden musste ich erweitern. Dadurch hab ichs gepackt über 100 Tests für das Projekt zu schreiben :slight_smile:.

24 Komponenten Tests
79 Unit Tests
=> Macht 103 Tests bisher

Und alle sind Grün :slight_smile:

2 „Gefällt mir“