Wie lerne ich mit C# spiele zu Programmieren?
Hey. Ich hab mich dazu entschieden, zu Lernen, wie man Spiele programmiert. Da ich meine Spiele mit Unity erstellen möchte bin ich gerade dabei C# zu lernen. Ich habe mir das 3 stündige C# Grundkursvideo von Programmieren Lernen! auf Youtube angeschaut. Die Schleifen, If-Abfragen, Arrays, und die anderen Commands im Video, habe ich versucht zu Lernen. Bis jetzt hat das ganz gut funktioniert, allerdings weiß ich jetzt nicht genau wie mir das beim spiele Programmieren helfen soll. Ich weiß das diese Befehle wichtig sind. Allerdings geht es in vielen Spielen ja auch um Bewegungen, Interaktionen oder andere Mechaniken, die mit Arrays Schleifen oder anderen Grundcommands nicht möglich sind. Hat vielleicht jmd. eine Idee wie ich weiter machen könnte um solche Befehle zu lernen und anwenden zu können? Eventuell eine Empfehlung für ein Video oder ähnliches?
Würde mich über eine Antwort freuen.
3 Antworten
(...) allerdings weiß ich jetzt nicht genau wie mir das beim spiele Programmieren helfen soll.
Schleifen, Verzweigungen, Arrays u.ä. sind die Grundbausteine für deine Algorithmen. Nimm nur einmal das Spiel Space Invaders als Beispiel: Eine Schleife kann als Game Loop dienen, mittels Verzweigungen kann der Spielstatus (oder andere Spielregeln, wie die Begrenzung des Spielfeldes) überwacht werden und ein Array kann sich die vom Spieler abgefeuerten Schüsse merken.
(...) Ich habe mir das 3 stündige C# Grundkursvideo von Programmieren Lernen! auf Youtube angeschaut. (...)
Beim Lernen von C#/Programmierung ist es wichtig, das Angelernte auch praktisch zu üben. Ich weiß nun nicht, wie dein aktuelles Vorgehen ist, doch wenn es sich nur auf das Anschauen von Videos beschränkt, reicht das definitiv nicht aus. Ebenso würde ich empfehlen, Themen (wie OOP) nicht crashkursmäßig in ein paar Stunden/Tagen abzuklappern.
Hat vielleicht jmd. eine Idee wie ich weiter machen könnte um solche Befehle zu lernen und anwenden zu können?
Innerhalb eines Konsolenprojekts lassen sich schon viele verschiedene Themen gut erproben. Du kannst eigene Datenstrukturen (z.B. Stack, Tree, Graph) implementieren oder Minispiele (Conway's Game Of Life, ein Text-Adventure, Snake, Kartenspiele wie Mau-Mau, Schiffe versenken, Tic-Tac-Toe, Schach, ...).
Fange bei solchen Übungen erst mit einer Planungsphase (außerhalb des Editors) an. Mache dir darüber Gedanken, was du benötigst und wie es sich zusammensetzt. Bau dir z.B. Programmablaufpläne o.ä.. Für Spiele (vor allem größere Projekte als Pong oder Tic-Tac-Toe) macht ein GDD Sinn.
Wenn du der Ansicht bist, in den Grundlagen (dazu zähle ich auch die OOP) halbwegs fit zu sein und dir solche Aufgaben, wie die von mir oben vorgeschlagenen, keine Probleme bereiten, spricht sicherlich nichts dagegen, mit Unity zu starten.
Von da an wäre das Manual von Unity sowie deren Lernplattform dein bester Freund. All diese Inhalte sind von der Unity-Startseite aus erreichbar.
(...) Was ich nicht verstehe sind Klassen und Eigenschaften. (...)
Die objektorientierte Programmierung ist eine Methodik der Programmstrukturierung. Dabei versucht man ein System (die Spielwelt) mit Objekten (Spieler, Gegner, Waffe, Baum, Haus, ...) zu beschreiben. Jedes Objekt hat einen eigenen Zustand, der durch verschiedene Eigenschaften beschrieben wird. Das könnte beispielsweise die Lebensenergie, die Sprungkraft oder äußerliche Merkmale wie Farbe, Höhe, Breite sein. Ebenso hat jedes Objekt eigene Verhaltensweisen / Methoden: Eine Spielfigur kann zum Beispiel laufen, springen, kämpfen oder sterben. Die Beziehungen/Interaktionen zwischen den Objekten können ihre Zustände ändern (Beispiel: Spieler schlägt Troll, welcher dadurch Lebensenergie verliert).
Welche Objekttypen es grundsätzlich gibt und wie sie sich aufbauen (welche Eigenschaften und Methoden sie haben), wird mit Klassen spezifiziert. Eine Klasse ist also ein Bauplan, anhand dessen verschiedene Objekte erstellt werden können.
Bei Pong wäre das schon einmal nützlich, um einen Ball und zwei Schläger zu kreieren. Bei Pac-Man wären der Hauptcharakter, die Geister, die Felder (Mauer oder begehbares Feld) sowie die aufsammelbaren Früchte und Punkte einzelne Objekte.
Hab bis jetzt nur Die Programme im Video nachgebaut, ausprobiert, versucht zu verstehen und mir immer nebendran Kommentare hingeschrieben, die den Ablauf erläutern, um immer nach schauen zu können, falls ich mal vergessen hab wie zum Beispiel Arrays funktionieren oder so. Danke für die Tipps und die Erklärung
Hey,
es wirkt so, als seist du mit der Programmierung generell noch nicht so vertraut. Dieses Verständnis ist aber für die Spieleentwicklung entscheidend, deswegen würde ich dort anfangen. Den Einstieg mit Tutorials finde ich schon gut. Du kannst einfach weitermachen und immer mehr Tutorials zu verschiedenen Bereichen mit Unity machen, mit Schwerpunkt Programmierung.
Sinnvoll könnte es aber auch sein, dass du ganz unabhängig von Unity das Programmieren grob lernst, z.B. in der Sprache C++ oder Java, oder auch direkt C#, das z.B. auch für iPhone-Apps verwendet wird. Programmieren zu lernen, zu verstehen und anwenden zu können, ist am Anfang etwas knochig, aber es lohnt sich. Für die Spieleprogrammierung ist es sogar notwendig. Und ich schätze es so ein, dass dir ein paar Basis-Skills ausreichen, damit du dann ein Grundverständnis entwickelst und eigenständig den Rest erschließen kannst
Ich glaube Schleifen benutzt man z.b. zur Steuerung, da man ja immer Laufen möchte. Oder If Abfragen beim Tod evnt.. Was ich nicht verstehe sind Klassen und Eigenschaften. Da bin ich echt am verzweifeln was die bringen sollen :(
würde mich freuen wenn du mir die Basics erklären könntest
Es ist viel Allgemeiner: Schleifen und generell alle Befehle sind universelle Werkzeuge, mit denen du Probleme lösen kannst und Aufgaben erfüllen kannst
Bei Unity ist es so, dass für jedes Spielobjekt zu bestimmten Zeitpunkten, z.B. bei jedem Frame oder zu Beginn ein Porgrammcode ausgeführt wird und du hast im Prinzip alle Freiheit der Welt, irgendwelche Dinge ausführen zu lassen
Wie du schon gesagt hast, ist das z.B. sinnvoll bei der Steuerung, wenn du z.B. überprüfen möchtest, ob eine Taste gedrückt ist und, falls ja, die Geschwindigkeit der Spielfigur manipulieren willst. Du kannst aber auch komplett andere Dinge machen, wie z.B. neue Objekte erstellen zu lassen, einen Sound abspielen zu lassen oder einen Highscore online abzuspeichern, falls du einen neuen erreicht hast
Welche dieser Tools du wie kombinierst, hängt von der Aufgabe ab, die du erfüllen willst. For-Schleifen z.B. sind meistens dafür da, Listen abzuklappern oder Dinge einach sehr oft zu wiederholen. Das könnten z.B. Objektlisten sein, die du z.B. auf Kollision überprüfen möchtest etc
Diese ganzen Befehle dienen also nur dazu, Aufgaben zu erfüllen, aus denen dein gesamtes Spiel sich dann zusammen setzt
Ich weiß jetzt nicht, in welchem Kontext du die Klassen verstehen möchtest, aber generell sind das quasi "Bauanleitungen" für Objekte, aus denen dann einzelne Objekte, z.B. halt Spielobjekte erstellt werden können. Sie beschreiben einfach, was ein Objekt für Funktionen hat, welche Eigenschaften es hat etc
Danke! hat wirklich sehr geholfen. Das mit den Klassen habe ich glaube ich auch verstanden :)
Klassen sind, wie Neuron schon gesagt hat, Baupläne für Objekte oder Charaktere. Was da wichtig ist ist Vererbung. Stell dir vor du hast in einem Spiel 3 Potions, Leben, Mana, und eine Gift Potion die geworfen werden kann und Gegner vergiftet. Du willst jetzt aber nicht für jede Potion eine eigene Klasse anlegen. Könntest du zwar machen, ist aber nicht Sinnvoll.
Statdessen machst du folgendes: Du schreibst eine Basisklasse, die du Potion nennst, und von dieser Klasse erstellst du Kindklassen, die alles was in Potions ist haben, und Funktionen überschreiben können. Sie "Erben" quasi alles von Potion. Das ist Vererbung. So kannst du eine Basiklasse Potions anlegen und da Informationen wie Farbe, Wert, Gewicht und so hinterlegen. Jedes Objekt von Potion muss jetzt auch diese Werte haben, da sparst du dir die Arbeit das nochmal neu für jede einzelne Potion zu definieren.
Dann haben die Potions aber jeweils einen anderen Effekt. Und hier kommt das Zauberwort "virtual" ins Spiel. Eine Methode als "virtual" zu deklarieren erlaubt es Klassen die von der Mutterklasse erben eine Methode auf ihre ganz eigene Weise zu implementieren, aber sie müssen sie implementieren. Also hat Health Potion den Effekt Health +120, Mana Potion dann Mana +150, und Poison bekommt dann die Wurf funktion, und bei einem Treffer, fügt dem Gegner 80 poison damage zu.
Puh, es ist eine Weile her, dass ich mit Unity etwas gemacht habe, habe es zur Zeit auch nicht installiert. Aber soweit ich mich erinnere, bestanden die meisten Objekte aus GameObject, was selbst schon eine Klasse ist. D.h., GameObjects haben Funktionen (Methoden) und Eigenschaften. In der objektorientierten Programmierung (wie bei Unity) geht man meist so vor, dass man vorhandene Klassen nimmt und eine eigene Klasse, basierend auf der alten Klasse schreibt und ihr neue Funktionen gibt oder sie verändert (Vererbung). Ob man Gegner jetzt auf GameObjects basieren lässt, weiß ich nicht mehr, aber vermutlich musst du für deine Gegner eine neue Klasse erstellen, die auf irgendeiner Klasse basiert, die Unity mitliefert
Da ist das Problem: Unerfahrenheit. In Spielen sind Interaktionen, Mechaniken und Co. allesamt durch grundlegende Programierbausteine darstellbar. Dialogbaum? Reihe von if Abfragen oder besser, switch case. Inventar? Array, oder besser, Liste, oder noch besser, Dictionary. Schadenskalkulation? + und - rechnen. Bewegungen? Verschieben eines Punktes auf einem Koordinatensystem. Du musst lernen deine Probleme in winzige, programmierbare Bauteile zu zerlegen, und diese dann umzusetzen.
Ein ganz tolles Beispiel um das zu verstehen ist Minecraft. Wenn du im Spiel bist und die Überwachung aktivierst, siehst du drei Koordinaten auf 3 Achsen, X, Y und Z, die deine Spielposition jederzeit überwachen. Das ist in jedem Spiel so oder so ähnlich gelöst.
Daran hab ich noch nie gedacht. Danke für die Antwort. Ich versuche es weiter um mehr erfahrung zu sammeln
Danke für die umfangreiche Anwort. ich werde es weiter probieren!