Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Exlo

Frischling

  • »Exlo« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Braunschweig

  • Private Nachricht senden

1

29.06.2016, 23:59

Meinungen zum Game Jam Spiel

Hallo Leute,

ich wollte mich und mein kleines Game Jam Spiel vorstellen um mir mal einige Meinungen einzuholen was man am Quelcode noch verbessern könnte.
Also erstmal zu mir.

Ich bin Martin, 26 jahre alt, wohne in Braunschweig und studiere Informatik im 2 Semester. Ich bin noch ein Anfänger im Spiele programmieren. Seit ca 6 7 Monaten beschäfftige ich mich intensiver mit Unity 3D.

Das Projekt was ich euch vorstellen möchte, ist ein Spiel vom Rocketbeans Community Game Jam. Ich habe es mit einen Freund zusammen entwickelt. Er war für die Grafiken zuständig und ich für die Programmierung.

Nun zum Spiel. Wir haben Platz 24 von insgesamt 48 Spielen belegt, worauf wir schon etwas stolz sind für unsere erste Game Jam :D . Das Spiel heißt Dawn Of The Nuts. Probiert es mal aus und sagt mir was ihr generell davon haltet und ich würde mich auch sehr freuen, wenn ihr mal mein Quellcode oder generell das Projekt anschaut und mir einige Tipps geben könntet wie man besser und effektiver Codet und vielleicht habt ihr ja den einen oder anderen Kniff auf lager. ;)

Hier noch die GitHub Repository. Ich weiß nicht wie ich sonst das Projekt veröffentlichen soll. Vielleicht habt ihr auch da einen Tipp.

Vielen Dank für eure Aufmerksamkeit
Martin :)

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

30.06.2016, 01:01

Moin moin!
Erstmal freut mich, dass ihr beim Game Jam mitgemacht habt. Hoffe er hat euch gefallen, wenn nicht ist es nämlich meine Schuld;).

Zum Spiel:
Das Spiel ist natürlich sehr einfach, aber es funktioniert, stürzt nicht ab und man kann es tatsächlich spielen. Sogar mit Menü und Winning/Failure Conditions us.w
Die Grafiken scheinen auch alle selbstgemacht und insgesamt ist es ein rundes Ding. Für nen Jam also insgesamt ein Erfolg!

Zum Code an sich:
Man kann sich natürlich viel darüber unterhalten, wie ihr den Code strukturieren solltet. Wie ihr besser Kommentare macht usw. Darin sind andere wesentlich besser als ich; für mich sieht der Code allerdings für ein erstes Projekt allerdings schon gut kommentiert aus. Allerdings sind manchmal gar keine Kommentare da und es wird sich zu sehr auf sprechenden Code verlassen. Meiner Erfahrung nach wird man da schnell faul. Ein einfacher Kommentar, was in den nächsten Zeilen passiert bewirkt Wunder!

Außerdem gibt es Konstrukte wie diese hier:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    public float speed;
    public float health;
    public Text wave;
    public Text life;
    public Text highscore;
    public Image headImage;
    public Sprite[] headSprites;
    private static bool noMove;
    private bool stop = false;
    private int score;
    private bool timeoutField = false;
    GameObject textWave;
    private GameObject gameManager;


Ist natürlich auch nicht sehr schön. Ich mag die Properties gerne geordnet und kommentiert.

Eine Technik, die ich benutze, um Variablen mit gettern/settern zu serialisieren ist folgende:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
[SerializeField]
float irgendeinWert = 0.0f;

// ....

public float irgendeinWert 
    {
        get
        {
            return irgendeinWert;
        }
    }


Schlussendlich benutzt du in einer Update-Funktion(und an anderen Stellen) GetComponent()

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void Update() {
        highscore.text = score.ToString();
        healthAdvice();
 
        if (!noMove) {
            movement();
            wave.GetComponent<Text>().enabled = false;
        } else {
            this.transform.position = new Vector3(0, 0, 0);
            wave.GetComponent<Text>().enabled = true;
            wave.text = "wave " + textWave.GetComponent<EnemySpawner>().getWaveCounter().ToString();
        }
}


GetComponent ist ziemlich performancelastig auf Dauer. Das solltest du dir schnell abgewöhnen! Am besten diese Components auf irgendeine Art und Weise cachen. Im Objekt selber, in einer eigens dafür angelegten Klasse oder wie auch immer. Auf jeden Fall sollten diese GetComponent()-Aufrufe so wenig wie möglich gemacht werden.
Ansonsten solltest du Funktionen und Variablen natürlich einheitlich benennen. Das habe ich jetzt nicht weiter kontrolliert.

Für ein erstes Game Jam Spiel auf jeden Fall gut! :)
Freue mich auf mehr von euch hier auf dem Forum!
WIP Website: kevinheese.de

Exlo

Frischling

  • »Exlo« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Braunschweig

  • Private Nachricht senden

3

30.06.2016, 12:21

Ach Dima :D wusste gar nicht, dass du hier auch unterwegs bist. :)

Ja war ein cooler Game Jam und ich bin beim nächsten mal aufjedenfall wieder dabei :).

Was meinst du mit sprechenden code? Ist das man die Variablen und die Methoden nur nach der Funktion benennt und mehr nicht? Das mit den Properties kann ich verstehen. Wie ordnest du die denn? Nach Dateityp und jeder bekommt ein kleinen Kommentar?
Das mit den Gettern und Settern werde ich mir mal anschauen. :)

Also generell die GetComponent nicht verwenden oder nur nicht mehr in der Update Methode?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

4

30.06.2016, 16:32

Dima war auch dabei, aber ich bin als Zerus in der RBTV com bekannt ;)

Mit sprechendem code meine ich Variablen und Funktionen, deren Namen den Sinn und Zweck bereits innehalten.
Die Properties meine ich genau so - ich unterteile sie auch gerne in Logikblöcke. Dann sieht man auch schnell, ob man was auslagern sollte und man eine Gottklasse schreibt.

GetComponent is ok, sollte aber pro Objekt nicht mehrmals aufgerufen werden. Das kostet jedes Mal wertvolle Performance!
WIP Website: kevinheese.de

Exlo

Frischling

  • »Exlo« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Braunschweig

  • Private Nachricht senden

5

30.06.2016, 20:46

Ah moin zerus.

Ich bin leider nicht so oft im Chat und im Forum. Da hab ich leider wenig zeit für also kenn ich dich leider nicht :(.
Danke für die Tipps. Das mit den Logikblöcken und der Gottklasse kenn ich leider auch nicht :/. Kannst du da mal ein beispielcode zeigen?

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

6

30.06.2016, 21:03

Keine Panik, das ist Absicht ^^

Zum Thema Gottklasse:
https://de.wikipedia.org/wiki/Gottobjekt
WIP Website: kevinheese.de

Exlo

Frischling

  • »Exlo« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Braunschweig

  • Private Nachricht senden

7

01.07.2016, 01:55

ja danke dir für die tipps :)

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

8

01.07.2016, 17:25

Zum Thema GetComponent vielleicht nochmal nachträglich:

Die einfachste Methode ist, wenn du den GetComponent Aufruf in die Start()-Methode verlegst und das Ergebnis zwischenspeicherst. Es gibt auch die Methode, dass du ein Cache-Objekt schreibst, das einfach alle Components, die du jemals verwenden möchtest, einmal speichert (und löscht, wenn sie nicht mehr gebraucht werden). Da gibt es nicht wirklich eine perfekte Lösung, sondern es kommt immer auch ein wenig auf das Spiel an.

Allerdings ist auch GetComponent nicht das größte Problem in Unity. Es dauert schon sehr lange, bis es dir wirklich die Performance versaut. Find() usw sind da allerdings schon schlimmer, und bevor du dir angewöhnst, dich auf solche Funktionen zu verlassen, solltest du dir eben angewöhnen eigene Lösungen für das Finden von Objekten und deren Komponenten zu fnden. Bei einem RTS macht beispielsweise ein UnitManager Sinn usw.
WIP Website: kevinheese.de

Exlo

Frischling

  • »Exlo« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Braunschweig

  • Private Nachricht senden

9

02.07.2016, 13:30

Gut zu wissen. Ich hätte jetzt einige Probleme mit Find() gelöst :D . Ich hab davor schon ein Gamemanager erstellt, der das ganze Spiel über nicht zerstört wird und da alles zur verfügunstellt wenn es gebraucht wird.

danke für die hilfe

Werbeanzeige