Sascha Geschrieben 12. Juli 2010 Melden Share Geschrieben 12. Juli 2010 Lies Dir bitte Scripten in Unity für Einsteiger und Scripten in Unity für Nicht-mehr-Einsteiger durch, bevor Du dich an dieses Tutorial setzt. Sonst kommt absolut Bahnhof dabei raus. Noch mehr Scripten in Unity - Teil 2: Klassen und Überladungen Wer sich durch die vorherigen Tutorials durchgearbeitet hat, darf jetzt ein wenig programmieren für Fortgeschrittene. Yay! Was nun folgt, ist ein Einblick in objektorientierte Programmierung, welche in dieser Form eigentlich gar kein Teil von JavaScript ist. Von C# schon, dennoch bleiben wir auch weiterhin nur bei ersterem. Ich erzähle zur Einleitung mal ein bisschen aus dem Nähkästchen, als ich vor langer Zeit mal versuchte, eine 3D-Engine zu schreiben. Ich wollte eine gewisse Anzahl von 3D-Rechtecken speichern, die natürlich vier Eckpunkte im Raum hatten. Also bastelte ich mir vier Arrays (siehe vorheriges Tutorial), eines für die ganzen ersten Punkte, eines für die ganzen zweiten, usw. Selbst Programmieranfänger dürften einsehen, dass das ganz schön unschön ist. Man stelle sich vor, eines der Arrays würde aus irgendeinem Grund unabhängig von den anderen geändert werden. Und überhaupt: Fügt man ein neues Rechteck hinzu, muss man alle vier Arrays bearbeiten. Damals habe ich eine Sache nicht gekonnt: Objektorientiertes Programmieren. Das wärs aber gewesen. Teil 1 - Class Hätte der kleine Sascha mehr Ahnung gehabt, so hätte er folgendes gewusst: Man hätte sich eine so genannte Klasse erstellen können, die ein solches Rechteck repräsentiert. Diese hätte vier Variablen gehabt: Für jeden Eckpunkt eine, und anschließend hätte er alle Rechtecke in ein Array getan. Das klingt doch viel besser! Klassen erzeugt man in Javascript mit dem Keyword class: class Rechteck { } Diese Klassen kann man überall definieren, solange es außerhalb einer Funktion ist. Es bietet sich der Ordnung zuliebe an, das vor den Variablendeklarationen zu tun. Klassen werden, wie Funktionen, am Anfang groß geschrieben. Innerhalb der Klasse wird genau wie drumherum gescriptet: class Rechteck { var Punkt1 : Vector3; var Punkt2 : Vector3; var Punkt3 : Vector3; var Punkt4 : Vector3; function DrehMich() { //...Code zum Drehen } } Eine Klasse ist, wenn sie definiert ist, ganz einfach als Variablentyp zu benutzen: var eckbert : Rechteck; Beim Initialisieren braucht man ein neues Keyword: new. eckbert = new Rechteck(); Die Klammern müssen sein, Erklärung gibt's im Abschnitt "Konstruktoren". Aber bevor wir voranschreiten: Eine Rechteck-Klasse ist ziemlich blöd, weil wir schließlich in Unity sind, und Unity regelt die Sache mit den Meshes schon für uns. Es gibt aber hin und wieder gute Gelegenheiten, Klassen zu benutzen. Immer, wenn mehrere Variablen zu einer Gruppe gehören, gruppiert man sie in einer Klasse. Teil 2 - Klassenhierarchie Will man die Variablen oder Funktionen eines Objekts (so nennt man eine Variable, die eine Klasse als Datentyp hat) ansprechen, so benutzt man einfach den guten, alten Punkt: class Vector5 { var x : float; var y : float; var z : float; var v : float; var w : float; } var victor : Vector5 = new Vector5(); function Start() { victor.x = 100; } Auch bei Funktionen: class Person { var name : String = "Unbekannt"; var groesse : float = 1.8; function Wachse(amount : float) { groesse += amount; } } var lars : Person = new Person(); function Start() { lars.name = "Lars"; lars.Wachse(0.1); } ...und schon ist Lars 1,90m groß Es gibt eine besondere Art Funktionen: Konstruktoren. Teil 3 - Konstruktoren Ein Konstruktor ist nichts weiter als eine Funktion, die den Namen ihrer Klasse trägt und dadurch beim Initialisieren des Objekts ausgeführt wird. Konstruktoren sind dazu da, Variablen des Objekts dynamisch zu initialisieren, indem man Parameter benutzt: class Person { var name : String; var groesse : float = 1.80; function Person(derName : String) { name = derName; } } //... var sascha : Person = new Person("Sascha"); Jetzt kann die Klasse "Person" nicht mehr initialisert werden, ohne "name" anzugeben, da der vorherige Konstruktor ohne Parameter durch die Definition eines neuen ungültig wird. Ein Keyword ist insbesondere hierbei hilfreich: this. "this" repräsentiert die Klasse, in der es angewandt wird: class Person { var name : String; function Person(name : String) { this.name = name; } } Hätte ich "name = name;" geschrieben, hätte es natürlich nicht geklappt, denn "name" ist ja der Parameter in der Funktion. "this.name" ist allerdings die Variable "name" der Klasse "Person". Wunderbar. Übrigens: Der Aufbau eines Scripts und der Aufbau einer Klasse ist aus genau einem Grund identisch: Scripts sind selbst eine Klasse mit dem Namen, den man der Scriptdatei gibt. Wer in C# programmiert, muss deshalb sogar bei jedem C#-Script den gesamten Script in eine Klassendefinition setzen, aber das gehört nicht hierher. Teil 4 - Überladungen Es gibt eine interessante Eigenschaft von Funktionen. Man kann die selbe Funktion mehrere Male, aber mit unterschiedlichen Parametern deklarieren. Jede Variation einer Funktion nennt man Überladung. Beim Aufruf der Funktion wird die Überladung aufgerufen, deren Parameterliste mit den Parametern im Funktionsaufruf übereinstimmt. function MachWas(param : String) { print("Du hast die String-Version aufgerufen."); } function MachWas(param : int) { print("Du hast die int-Version aufgerufen."); } //... Machwas(4); Es geht, wie man sieht, nur über die Variablentypen, nicht um deren Namen: Beide Parameter heißen "param", dennoch ist die Angelegenheit eindeutig und damit fehlerfrei. Falsch dagegen: function MachWas(param : String) { } function MachWas(dingens : String) { } Diese beiden Funktionen haben eine identische Parameterliste, Ergebnis: Fehler! Mehrere Überladungen sind vor allem bei Konstruktoren sinnvoll. Teil 5 - Abschließende Worte Das war jetzt ein Einblick in objektorientierte Programmierung. Sehr fortgeschritten. Wenn Du alles verstanden hast: Glückwunsch - Du bist cool! 6 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
DoubleM Geschrieben 13. Juli 2010 Melden Share Geschrieben 13. Juli 2010 Schönes Tutorial! Ich habs zwar nur überflogen und neues stand für mich auch nicht drin, aber das was ich gesehen habe sah gut aus. Und Lars freut sich bestimmt auch über die 10cm mehr Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
PfandFlÄsh Geschrieben 10. August 2010 Melden Share Geschrieben 10. August 2010 Echt hamma von dir diese ganzen Tut´s ^^ Ich bin ein völliger Anfänger und versuche jetzt durch deine Tut´s das Scripten zu erlernen. Danke ! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.