Jump to content
Unity Insider Forum

Noch mehr Scripten in Unity - Teil 3: Statische Variablen


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 könnte es hier Probleme geben.

 

Noch mehr Scripten in Unity - Teil 3: Statische Variablen und Funktionen

 

Dies ist ein ganz kurzes Tutorial, das eigentlich schon gar keins mehr ist. Ich erläutere kurz, was eine statische Variable/Funktion ist.

 

Eine statische Variable/Funktion wird mit dem Keyword "static" deklariert:

static var variable;
static var zahl : int;
static var wort : String = "Hallo";

static function Foo()
{

}

 

Der Unterschiede zwischen normalen und statischen Variablen ist der, dass eine Statische Variable nicht instanzabhängig ist.

D.h.: Wenn man ein Skript hat, den man zwei Objekten zuweist, und in dem Skript den Wert der Variablen ändert, dann gilt der veränderte Wert für BEIDE Instanzen des Skripts, genauer für ALLE Instanzen.

 

Wozu soll das gut sein?

 

Bei Variablen wahrscheinlich zu gar nichts.

Denn wenn man z.B. zwei Türen hat und eine statische Variable im Türskript, die sagt, ob die Tür offen ist, ist doof, denn dann können nur beide Türen auf oder beide Türen zu sein.

 

Bei Funktionen auch eher erstmal nicht.

Schauen wir uns daher an, was für einen netten Nebeneffekt statische Variablen haben:

Man kann sie direkt über das Skript ansprechen.

 

Hä?

 

Wenn ich ein Skript schreibe, der Dingens heißt und so aussieht:

static var kirchen : String = "nix";

..dann kann ich folgendes in einem ANDEREN Skript tun:

Dingens.kirchen = "was";

Und tatsächlich wird "kirchen" geändert.

 

Eine statische Variable ist eine Variable des Scripts selbst, und nicht einer Skriptinstanz (also einer zugewiesenen Skriptkomponente).

Dennoch kann man von innerhalb des Skripts darauf zugreifen:

static var kirchen : String = "nix";

function Start()
{
kirchen = "was";
}

Beachte dabei, dass Start() nicht statisch ist, und nur aufgerufen wird, wenn es auch eine Skriptinstanz gibt!

 

Genau so geht es mit Funktionen:

static function MachWas()
{
/...
}

...wird aufgerufen durch:

Dingens.MachWas();

Beachte hierbei, dass in einer Statischen Funktion nicht ohne weiteres auf ein GameObject zugegriffen werden kann:

static function MachWas()
{
transform.Translate(0,0,10); //FEHLER!!!!
}

...denn eine statische Funktion wird ja im Skript selbst ausgeführt.

Stellt euch vor, ihr habt 50 GameObjects mit je einem MachWas-Skript drauf - woher soll Unity da wissen, von welchem GameObject das gemeinte Transform sein soll?

Versucht man so etwas, gibt es einen Fehler.

 

Bei statischen Deklarationen ist zu beachten, dass sie für alle Skriptinstanzen gleich gelten.

Das bedeutet, dass ein Wert für ein Objekt, das es mehrere Male geben kann, niemals statisch sein darf, erinnere Dich an die Türen.

 

 

Eine Eigenschaft statischer Variablen ist noch zu nennen: Ihre Werte bleiben auch erhalten, wenn ein neue Scene geladen wird, da sie ja im Skript selbst verändert werden, und nicht in einer der Skriptinstanzen, die beim Laden einer neuen Scene verloren gehen.

 

 

Wozu man statisches nun gebrauchen kann?

Da gibt es einiges.

 

Man kann z.B. einen Skript namens "Global" definieren, in dem die momentanen Einstellungen, die das ganze Spiel betreffen, stehen, sofern man das nicht über PlayerPrefs machen möchte.

 

Ich zum Beispiel habe mir ein Overlay namens ColdAccess programmiert, die überall im Spiel durch das Drücken auf "Escape" zu erreichen ist, in dem man alles mögliche einstellen kann, wie Lautstärke oder Qualität.

Ob das Overlay aktiv ist, welches Fenster davon gerade aufgerufen ist und alle andere Variablen und Funktionen des ColdAccess-Skripts sind statisch, sodass sie überall im Spiel gleich funktionieren.

Außerdem kann ich jederzeit auf diese Variablen und Funktionen zugreifen, mit ColdAccess.Active() kann ich z.B. abfragen, ob das Overlay aktiv ist.

Ansonsten müsste ich jedes Mal mit GameObject.Find() oder degleichen arbeiten, und das wäre ja nicht so schön.

 

 

Wozu ihr statische Variablen/Funktionen nun nutzt, bleibt gänzlich euch überlassen, denn dass man sie wirklich braucht kommt in Unity gar nicht so oft vor, wie man vielleicht denkt.

Ich hoffe aber, dass ihr jetzt wisst, wozu statische Variablen nicht benutzt werden sollen, und dass ihr den Fehler meidet, es trotzdem zu tun.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 11 months later...

Erstmal :

Deine Tutorials sind super ! :D

 

Aber,ich fände es gut wenn du mal ein Tutorial schreibst,

in der "richtig" die API von Unity behandelt wird.

Zum Beispiel wie man einen Character zum laufen,

oder auch nur wie man 3D-Objekte bewegt.

Ich weiß wie viel Arbeit so ein Tutorial macht aber,

ich würde mich freuen wenn du deine Reihe etwas

in die von mir beschriebene Richtung fortsetzen würdest.

 

Gruß ,

Yannic

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...