Benutzer-Werkzeuge

Webseiten-Werkzeuge


theorie:programmieren

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
theorie:programmieren [2023/03/07 21:08] – [Listen durchgehen] "du" durchziehen spielzimmertheorie:programmieren [2023/03/10 10:36] (aktuell) – [Vorhandene Variablen benutzen] unity link spielzimmer
Zeile 54: Zeile 54:
 In einem Spiel möchte ich ja nicht nur schicke Bytes im Speicher stehen haben, sondern es soll sich etwas am Bildschirm bewegen. In einem Spiel möchte ich ja nicht nur schicke Bytes im Speicher stehen haben, sondern es soll sich etwas am Bildschirm bewegen.
  
-Nehmen wir an ich habe ein Unity Projekt und eine schicke Szene zusammengeklickt. Dabei hat Unity für jedes Element ein [[https://docs.unity3d.com/Manual/GameObjects.html|GameObject]] angelegt, das ist so ein komplexer Datenklumpen den wir benutzen dürfen. Dazu klicken wir in Unity [[https://docs.unity3d.com/Manual/CreatingAndUsingScripts.html|"Skript Komponente hinzufügen"]] und uns wird ein praktisches Code Gerüst angelegt. Das dürfen wir zum Spielen benutzen. Wir recherchieren, dass die Position eines GameObject in der [[https://docs.unity3d.com/Manual/class-Transform.html|Transform-Komponente]] gespeichert wird und wir dessen Position verändern können, um unser Element herumzubewegen. In den [[https://docs.unity3d.com/ScriptReference/Transform.html|Unity Docs]] steht dieser Beispiel Code:+Nehmen wir an ich habe ein [[https://unity.com|Unity]] Projekt und eine schicke Szene zusammengeklickt. Dabei hat Unity für jedes Element ein [[https://docs.unity3d.com/Manual/GameObjects.html|GameObject]] angelegt, das ist so ein komplexer Datenklumpen den wir benutzen dürfen. Dazu klicken wir in Unity [[https://docs.unity3d.com/Manual/CreatingAndUsingScripts.html|"Skript Komponente hinzufügen"]] und uns wird ein praktisches Code Gerüst angelegt. Das dürfen wir zum Spielen benutzen. Wir recherchieren, dass die Position eines GameObject in der [[https://docs.unity3d.com/Manual/class-Transform.html|Transform-Komponente]] gespeichert wird und wir dessen Position verändern können, um unser Element herumzubewegen. In den [[https://docs.unity3d.com/ScriptReference/Transform.html|Unity Docs]] steht dieser Beispiel Code:
  
 <code csharp> <code csharp>
Zeile 80: Zeile 80:
 Ein Datenklumpen namens "child" hat also die Eigenschaft "position", zu der ich einen [[https://docs.unity3d.com/ScriptReference/Vector3.html|Vector3]], also einen dreidimensionalen Richtungspfeil, dazuzählen will. Das klingt ja schon mal nach herum bewegen. Ein bisschen Recherche später finden wir heraus, dass [[https://docs.unity3d.com/ScriptReference/Vector3-up.html|Vector3.up]] bedeutet (0,1,0), also aufwärts. Wenn wir (0,1,0) mal 10 rechnen, dann kommt (0, 10, 0) heraus. Wir wollen die Position also um 10 Schritte nach oben bewegen. Ein Datenklumpen namens "child" hat also die Eigenschaft "position", zu der ich einen [[https://docs.unity3d.com/ScriptReference/Vector3.html|Vector3]], also einen dreidimensionalen Richtungspfeil, dazuzählen will. Das klingt ja schon mal nach herum bewegen. Ein bisschen Recherche später finden wir heraus, dass [[https://docs.unity3d.com/ScriptReference/Vector3-up.html|Vector3.up]] bedeutet (0,1,0), also aufwärts. Wenn wir (0,1,0) mal 10 rechnen, dann kommt (0, 10, 0) heraus. Wir wollen die Position also um 10 Schritte nach oben bewegen.
  
-Und genau so hangelt man sich in der Dokumentation vorwärts. Von der kompletten Ahnungslosigkeit zu "das hab ich doch schon mal irgendwo gehört...". Es ist für Menschen nicht möglich zu erraten, was mit "Vector3" oder "Transform" gemeint ist. Das sind Datenklumpen, die Unity erfunden hat. Wir haben dem Computer gesagt er soll Unity benutzen, also müssen wir in der Unity Dokumentation nachschauen wie sie ihre Variablen genannt haben.+Und genau so hangelt man sich in der Dokumentation vorwärts. Von der kompletten Ahnungslosigkeit zu "das hab ich doch schon mal irgendwo gehört...". Es ist für Menschen nicht möglich zu erraten, was mit "Vector3" oder "Transform" gemeint ist. Das sind Datenklumpen, die Unity erfunden hat. Wir haben dem Computer gesagt er soll Unity benutzen, also müssen wir in der Unity Dokumentation nachschauen wie sie ihre Variablen genannt haben und was wir mit ihnen machen können.
  
 +
 +===== Listen durchgehen =====
 +
 +Oben sind wir über das Schlüsselwort "foreach" gestolpert. Zu deutsch "für jedes". Es bedeutet "für jeden Listeneintrag in dieser Liste, mache das folgende..."
 +
 +<code csharp>
 +        foreach (Transform child in transform)
 +        {
 +            child.position += Vector3.up * 10.0f;
 +        }
 +</code>
 +
 +Hierzu muss man wissen, dass in Unity ein Element in [[https://docs.unity3d.com/ScriptReference/MonoBehaviour.html|"transform"]] nicht nur die eigene Position speichern kann, sondern auch abhängige Elemente angehängt sein können. Diese "Kinder" sind ihrerseits eine Liste von Transform-Datenklumpen, die eigene Kinder haben können. Unity macht es uns leicht, diese Liste der Kinder durchzugehen: "transform" ist selbst die Liste seiner Kinder.
 +
 +Wir sagen dem Computer also "für jeden Transform-Datenklumpen in der Liste namens 'transform', nenne den Transform-Datenklumpen 'child' und mache das folgende innerhalb der geschweiften Klammern".
 +
 +Wenn ich das Unity Element selbst bewegen will und nicht seine angehängten Kinder, dann schreibe ich das so:
 +
 +<code csharp>
 +using UnityEngine;
 +
 +public class Example : MonoBehaviour
 +{
 +    // In a fixed time interval, move the object upwards
 +    void FixedUpdate()
 +    {
 +        transform.position += Vector3.up * 0.1f;
 +    }
 +}
 +</code>
 +
 +
 +Diesmal steht hier nicht Start(), sondern FixedUpdate(). Das sind vorgefertigte Einstiegspunkte, die uns Unity gibt um unseren Code irgendwo hin schreiben zu können, wo er auch im Programm ausgeführt wird. Die [[https://docs.unity3d.com/ScriptReference/MonoBehaviour.html|MonoBehaviour]] aus der UnityEngine ist dafür verantwortlich. Sobald ich so ein Skript zu einem Element in meiner Szene als Komponente hinzufüge, sorgt Unity dafür dass der Code zum Tragen kommt. Wir brauchen nur zu wissen, dass "Start" ein mal ganz am Anfang ausgeführt wird, "Update" jeden Frame und "FixedUpdate" immer im gleichen zeitlichen Abstand.
 +
 +Und dadurch haben wir schon alles, was wir brauchen, um unsere Szenen Elemente aus der Kamera schweben zu lassen!\\
 +Stöbere in den Docs, probiere herum und schau was passiert!
  
 ===== Was wäre wenn...? ===== ===== Was wäre wenn...? =====
Zeile 94: Zeile 130:
 if (Lebenspunkte <= 0) if (Lebenspunkte <= 0)
 { {
-  //Game Over+    //Game Over
 } }
 else else
 { {
-  //Weiter spielen+    //Weiter spielen
 } }
 </code> </code>
Zeile 106: Zeile 142:
 Die geschweiften Klammern braucht der Computer, um zu wissen, was alles dazugehört das er machen soll wenn die Lebenspunkte auf / unter 0 sind. Das "else" bedeutet "sonst", also in diesem Fall "falls die Lebenspunkte größer 0 sind". Die geschweiften Klammern braucht der Computer, um zu wissen, was alles dazugehört das er machen soll wenn die Lebenspunkte auf / unter 0 sind. Das "else" bedeutet "sonst", also in diesem Fall "falls die Lebenspunkte größer 0 sind".
  
 +Und weil wir die Lebenspunkte in unserem Spieler so speichern wollen, dass sich der Computer auch beim nächsten Update noch daran erinnert, speichern wir die Lebenspunkte als Eigenschaft des Beispiel Spielers. Das geht zum Beispiel so:
  
-===== Listen durchgehen =====+<code csharp> 
 +using UnityEngine;
  
-Oben sind wir über das Schlüsselwort "foreach" gestolpert. Zu deutsch "für jedes". Es bedeutet "für jeden Listeneintrag in dieser Liste, mache das folgende..."+public class ExamplePlayer : MonoBehaviour 
 +
 +    private int lebenspunkte;
  
-<code csharp> +    void Start() 
-        foreach (Transform child in transform)+    { 
 +        this.lebenspunkte = 100; 
 +    } 
 + 
 +    void FixedUpdate(
 +    { 
 +        //Hier prüfe ich eigentlich, ob der Spieler gerade irgendwo steht wo er Schaden nimmt. 
 +        //Um das Beispiel kurz zu halten habe ich eine giftige Atmosphäre die ständig Schaden macht. 
 +        int schaden = 13; 
 +        lebenspunkte -= schaden; 
 +     
 +        //Wenn der Spieler keine Lebenspunkte mehr hat, zum Game Over Screen wechseln. 
 +        if (lebenspunkte <= 0)
         {         {
-            child.position += Vector3.up * 10.0f;+            //Game Over
         }         }
 +        else
 +        {
 +            //Lebenspunkte Anzeige aktualisieren
 +        }
 +    }
 +}
 </code> </code>
  
-Hierzu muss man wissen, dass in Unity ein Element in [[https://docs.unity3d.com/ScriptReference/MonoBehaviour.html|"transform"]] nicht nur die eigene Position speichern kann, sondern auch abhängige Elemente angehängt sein können. Diese "Kinder" sind ihrerseits eine Liste von Transform-Datenklumpen, die eigene Kinder haben können. Unity macht es uns leicht, diese Liste der Kinder durchzugehen: "transform" ist selbst die Liste seiner Kinder.+===== Selbst ausprobieren =====
  
-Wir sagen dem Computer also "für jeden Transform-Datenklumpen in der Liste namens 'transform'nenne den Transform-Datenklumpen 'child' und mache das folgende innerhalb der geschweiften Klammern".+Noch lustiger wird es dann natürlich mit [[https://docs.unity3d.com/ScriptReference/Input.GetAxis.html|User Input]]. Wenn du die Unity Doc Beispiele dazu benutztdann stelle bitte von Update auf FixedUpdate um und wirf den Time.deltaTime Krempel raus. FixedUpdate ist für saubere Bewegungen zuständig und regelt die vergangene Zeit selbst. Update ist für saubere Anzeige zuständig, nicht für Mechanik Berechnungen.
  
-Wenn ich das Unity Element selbst bewegen will und nicht seine angehängten Kinder, dann schreibe ich das so:+In unser Beispiel Spieler Skript eingebaut schaut das dann so aus:
  
 <code csharp> <code csharp>
 using UnityEngine; using UnityEngine;
- +  
-public class Example : MonoBehaviour+public class ExamplePlayer : MonoBehaviour
 { {
-    // In a fixed time interval, move the object upwards+    private int lebenspunkte; 
 +     
 +    public float speed = 10.0f; 
 +    public float rotationSpeed = 100.0f; 
 +  
 +    void Start() 
 +    { 
 +        this.lebenspunkte = 100; 
 +    } 
 + 
     void FixedUpdate()     void FixedUpdate()
     {     {
-        transform.position +Vector3.up * 0.1f;+        // Get the horizontal and vertical axis. 
 +        // By default they are mapped to the arrow keys. 
 +        // The value is in the range -1 to 1 
 +        float translation Input.GetAxis("Vertical"speed; 
 +        float rotation = Input.GetAxis("Horizontal") * rotationSpeed; 
 + 
 +        // Move translation along the object's z-axis 
 +        transform.Translate(0, 0, translation); 
 + 
 +        // Rotate around our y-axis 
 +        transform.Rotate(0, rotation, 0); 
 +         
 +         
 +        //Hier prüfe ich eigentlich, ob der Spieler gerade irgendwo steht wo er Schaden nimmt. 
 +        //Um das Beispiel kurz zu halten habe ich eine giftige Atmosphäre die ständig Schaden macht. 
 +        int schaden = 13; 
 +        lebenspunkte -= schaden; 
 +  
 +        //Wenn der Spieler keine Lebenspunkte mehr hat, zum Game Over Screen wechseln. 
 +        if (lebenspunkte <= 0) 
 +        { 
 +            //Game Over 
 +        } 
 +        else 
 +        { 
 +            //Lebenspunkte Anzeige aktualisieren 
 +        }
     }     }
 } }
 </code> </code>
  
- +Und so basteln wir am Code weiter und weiterFür die ersten Minispiele ist es völlig in Ordnungwenn noch alles im Player Skript stehtJe größer ein Spiel wird, desto [[patterns|komplizierter]] müssen wir den Code strukturierenAlso halte deine ersten Versuche klein und freunde dich mit dem Programmieren im Zusammenspiel mit Unity an.
-Diesmal steht hier nicht Start(), sondern FixedUpdate()Das sind vorgefertigte Einstiegspunkte, die uns Unity gibt um unseren Code irgendwo hin schreiben zu könnenwo er auch im Programm ausgeführt wird. Die [[https://docs.unity3d.com/ScriptReference/MonoBehaviour.html|MonoBehaviour]] aus der UnityEngine ist dafür verantwortlich. Sobald ich so ein Skript zu einem Element in meiner Szene als Komponente hinzufüge, sorgt Unity dafür dass der Code zum Tragen kommtWir brauchen nur zu wissen, dass "Start" ein mal ganz am Anfang ausgeführt wird, "Update" jeden Frame und "FixedUpdate" immer im gleichen zeitlichen Abstand. +
- +
-Und dadurch haben wir schon alles, was wir brauchen, um unsere Szenen Elemente aus der Kamera schweben zu lassen!\\ +
-Stöbere in den Docs, probiere herum und schau was passiert! +
- +
-Noch lustiger wird es dann natürlich mit [[https://docs.unity3d.com/ScriptReference/Input.GetAxis.html|User Input]]. Wenn du die Unity Doc Beispiele dazu benutzt, dann stelle bitte von Update auf FixedUpdate um und wirf den Time.deltaTime Krempel raus. FixedUpdate ist für saubere Bewegungen zuständig und regelt die vergangene Zeit selbst. Update ist für saubere Anzeige zuständig, nicht für Mechanik Berechnungen.+
  
 Viel Spaß! Viel Spaß!
theorie/programmieren.1678219733.txt.gz · Zuletzt geändert: 2023/03/07 21:08 von spielzimmer

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki