Jump to content
Unity Insider Forum

Globale Variablen


grinseengel

Recommended Posts

Hallo,

ich suche nach einer Möglichkeit globale Variablen zu generieren, damit ich aus allen Scripten darauf zugreifen kann. Bisher habe ich das immer nur in einem Script gelöst. Jetzt wäre es natürlich schön, wenn ich auf diese global zugreifen könnte. Muss ich dafür eine eigene Klasse erstellen oder geht das auch anders?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Prinzipiell ist alles, was (public) static ist, global. Da es in C# (fast) keinen Code außerhalb von Klassen geben kann, muss eine statische Variable in einer Klasse drin sein. Ob du sie in eine auch anderweitig verwendete Klasse packst (muss ja nicht statisch sein) oder dir eine statische Klasse dafür machst, kommt ganz auf deine Architektur an. Du musst also nicht unbedingt eine statische Klasse machen, um statische Variablen darin zu deponieren.

ScriptableObjects haben den Vorteil, dass du davon mehr erzeugen kannst ohne Code anzufassen. Aber vor allem auch, dass du sie injecten ("wo reinziehen") kannst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok, also z.B. folgendes Beispiel:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GlobalValues : MonoBehaviour
{

    public static int leben;

}

Aufruf in jedem anderen Scipt:

public class Choosing : MonoBehaviour {
private void Start()
{
    GlobalValues.leben = 10
}
}

Dann kann ich auf leben mit jedem script zugreifen?

Link zu diesem Kommentar
Auf anderen Seiten teilen


 

vor 50 Minuten schrieb grinseengel:

Dann kann ich auf leben mit jedem script zugreifen?

Ja, du kannst dann von überall in über jede Szene in deinem Spiel auf diese Variable zugreifen.
Static bedeutet, dass diese Variable überall bekannt ist und überall existiert.
Aus diesem Grund darf diese Klasse nur einmal im Spiel vorhanden sein. Du kannst also nicht allen deinen Spielfiguren dieses Script zuweisen.

Wenn du aber einfachnur Globale Variablen sammeln willst, dann ist das recht praktisch. Denn das Script braucht keinem GameObjekt zugewiesen werden und sollte es auch nicht.
Erzeuge es und lass es einfach in deinem Projektordner liegen.

Wie gesagt: Die Variablen sind immer und überall bekannt. Das bedeutet auch, dass sie die Werte immer behalten.
Wenn du also, wie in deinem Beispiel, die Lebenspunkte dort ablegen willst, dann musst du daran denken, dass bei einem Szenenwechsel, wo ja alles in der neuen Szene mit Grundwerten beginnt, deine Lebenspunkte nicht verändert werden. Die haben immer noch den selben Wert.
Du musst die Werte also manuell zurückstellen!
Das ist der erste Nachteil.
Der zweite Nachteil ist, dass du die Werte der Variablen nicht im Inspector sehen kannst, was bei einer Fehlersuche sehr hinderlich sein kann.
Und selbst wenn du dieses Script nur als Container für alle Möglichen Grundwerte nutzen willst, musst du immer in das Script rein gehen um Werte anzupassen. Mal schnell im Inspector etwas zu ändern ist nicht möglich.

Vor- und Nachteile gleichen sich also ungefähr aus.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb chrische5:

Wenn ich dein Beispiel richtig lese, musst du zuerst eine Instanz der Klasse erstellen. Wenn du es so machen willst, wie im Beispiel dargestellt, musst du die Klasse IMHO auch statisch machen.

Nein, eine statische Variable kann auch in einer nicht-statischen Klasse sein und dort funktioniert exakt genau so. Um sie zu verwenden, ist keine Instanz der Klasse nötig, wenn diese nicht statisch sein sollte. In diesem Fall ist es allerdings in der Tat recht sinnlos, eine (nicht-statische) MonoBehaviour-Klasse zu haben, da diese auf ein oder mehrere GameObjects gezogen werden kann und dort exakt gar nichts macht.

vor 47 Minuten schrieb malzbie:

Aus diesem Grund darf diese Klasse nur einmal im Spiel vorhanden sein. Du kannst also nicht allen deinen Spielfiguren dieses Script zuweisen.

Ich muss da ein bisschen klugscheißen, und wenn ich schonmal dabei bin...

  1. Eine Klasse ist sowieso immer nur einmal im Programm. Es kann aber bei nicht-statischen Klassen keine, eine oder mehrere Instanzen einer Klasse geben. @grinseengel wenn du ein Script auf ein GameObject ziehst, entsteht eine Komponente - diese Komponente ist eine Instanz deiner Klasse, die du im Script geschrieben hast.
  2. Vermutlich meinst du das, @malzbie, aber ich glaube, man kann das etwas falsch verstehen: Da es sich um eine nicht-statische Klasse handelt, kann man "GlobalValues" beliebig oft auf irgendwelche GameObjects ziehen. Allerdings gibt es die Variable "leben" unabhängig davon immer nur genau ein Mal im Programm. @grinseengel Wenn du also "GlobalValues" zweimal auf irgendein GameObject ziehst (was, wie gesagt, sowieso wenig Sinn ergibt), dann arbeiten alle diese Komponenten mit derselben Zahl.

@grinseengel: malzbie hat mit den Nachteilen Recht. Grundsätzlich sieht man es immer wieder, dass Leute statische/globale Variablen als erstbesten Weg finden, damit ein Objekt an Werte herankommt, die woanders herkommen. Mit globalen Variablen holt man sich aber immer einen Haufen Restriktionen ins Haus und wird sie auch nicht mehr los. Das heißt nicht, dass man sie nicht nutzen sollte - aber man muss sich genau anschauen, was "static" bedeutet und was es mit sich bringt.

Da du gerade an dem Thema zum Lernen dran bist, würde ich sagen: Arbeite damit, dann fallen dir die Probleme früher oder später selbst auf. Das hilft immer am meisten. Wundere dich nur nicht, wenn es nervig wird ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...