Jump to content
Unity Insider Forum

Noch mehr Scripten in Unity - Teil 2: Klassen und Überladungen


Sascha

Recommended Posts

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ß :P

 

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...