Arma 3
Not enough ratings
Variablen Bereiche
By Joshua9797💾
Sichtbarkeit von Variablen.

Öffentliche und Private Variablen erklärt.
   
Award
Favorite
Favorited
Unfavorite
Inhalt
❗[Disclaimer] Es ist keinesfalls meine Absicht Falschinformationen zu verbreiten. Es kann allerdings dennoch sehr leicht vorkommen, dass ich mit meinen Erklärungen nicht komplett oder sogar ganz falsch liege. Ich lerne selbst noch SQF und kann dementsprechend nicht für eine 100% Korrektheit garantieren.

Inhalt:
  1. Öffentliche vs. Private Variablen
  2. Merkmal einer privaten Variable
  3. Bereiche
  4. Vorteile von privaten Variablen
  5. Nachteile von privaten Variablen
  6. Schlüsselwort „private“
  7. TAG´s

1. Öffentliche vs. Private Variablen:
Eine Variable, welche in Arma 3 angelegt wurde, (sei es in einem Trigger, Skript oder einem Init-Feld) muss nicht überall sichtbar bzw. bekannt sein.

Normalerweise kann man eine Variable z.B. in einem Trigger anlegen und in einem anderen Trigger weiterverwenden.
(Also ist diese in beiden Triggern bekannt und beide Trigger können auf diese zugreifen)

Solche Variablen nennt man „Öffentliche“ Variablen (eng. public).

Eine Öffentliche Variable ist auf der gesamten Maschine bekannt. Als Beispiel in jedem Trigger und in jedem Skript.
(Auch der Variable-Name einer KI oder eines bestimmten Objektes ist eine öffentliche Variable):
Aus diesem Grund kann man von überall auf diese zugreifen.
(Z.B. mit „setDamage“[community.bistudio.com]):
meinNPC setDamage 1;

Als Gegenstück gibt es sogenannte „Private“ Variablen (eng. private).

Eine private Variable ist nur in dem jeweiligen Trigger oder Skript. sichtbar, in welchem diese angelegt wurde.
(Nur in diesem jeweiligen „Bereich“, kann man auf den gewünschten Wert zugreifen)

Wenn man versucht, außerhalb von dem Trigger oder Skript auf die Variable zuzugreifen, dann wird das Spiel einen Fehler ausgeben das eine Variable mit diesem Namen nicht bekannt ist bzw. nicht definiert wurde.
2. Merkmal einer privaten Variable:
Eine private Variable fängt immer mit einem Unterstrich „_“ an. Das ist nicht nur eine Konvention, sondern wird von dem Spiel so unterstützt.

(Es kann also keine Öffentliche Variable geben, die mit einem Unterstrich anfängt):
_meineVariable = 1; // eine private Variable meineVariable = 2; // eine öffentliche Variable
3. Bereiche:
Den Teil, in welchem eine private Variable bekannt ist, nennt man einen „Bereich“ (eng. scope).

Dabei haben jeder Trigger, jedes Init-Feld und jede Skript-Datei einen eigenen Bereich, in welchem private Variablen angelegt werden können:
(Eine private Variable, die sich in einem Trigger befindet, ist also in einem separaten Bereich als eine private Variable in einer Skript-Datei)

Bereiche werden aber auch durch Geschweifte klammern geformt „{ }“. Z.B. bei If-Abfragen oder Funktionen.

(Der Inhalt zwischen den geschweiften Klammern befindet sich also in einem separaten Bereich)

Das bedeutet, das eine Variable, welche innerhalb einer If-Abfrage oder einer Schleife angelegt wurde, nicht außerhalb von dieser bekannt ist:
if (true) then { // Neuer Bereich in Geschweiften Klammern „{ }": _meineVariable = 1; }; // <- Ende des Bereiches in den Geschweiften Klammern „{ }" hint str _meineVariable; // Die Variable ist in diesem Bereich nicht bekannt!

Eine Private Variable, die in einem übergeordneten Bereich angelegt wurde, kann auch in einem untergeordneten Bereich verwendet werden.
(Andersherum funktioniert dies wie vorher beschrieben nicht)

Als Beispiel kann auf die Variable „meineVar“ auch innerhalb der If-Abfrage zugegriffen werden:
_meineVar = 1; if (true) then { // Neuer Bereich in Geschweiften Klammern „{ }": hint str _meineVar; // Die Variable ist noch aus dem Vorherigen Bereich bekannt };
(In einem vollkommen getrennten Bereich wie z.B. in einem anderen Trigger kann wiederum nicht auf die Variable zugegriffen werden)
4. Vorteile von privaten Variablen:
  • Eine private Variable kann es mehrmals mit dem gleichen Namen geben. (Sofern diese nicht schon in dem Bereich vorhanden ist)

    Also kann es z.B. in Trigger_1 eine Variable mit dem Namen „_var“ geben und in Trigger_2 eine andere Variable mit dem gleichen Namen „_var“.

    Dadurch kann man als Beispiel in jedem Trigger oder in jedem Skript eine Variable „_spieler“ haben, anstatt in jedem Trigger den Namen leicht anders anlegen zu müssen.

    (Der Inhalt wäre in diesem Beispiel dann immer anders. Ansonsten könnte man ja auch eine öffentliche Variable verwenden)

  • Man braucht sich keine Gedanken darum zu machen, ob man den Namen einer Variable bereits irgendwo in einem anderen Bereich verwendet hat.

5. Nachteile von privaten Variablen:
  • Es wird etwas schwieriger auf den Wert einer privaten Variable aus einem anderen Bereich zuzugreifen.

    Dazu muss man in dem Bereich, in welchem die private Variable bekannt ist, den Wert von dieser in eine öffentliche Variable kopieren. Dadurch kann man in dem anderen Bereich auf die öffentliche Variable zugreifen. (Es handelt sich in so einem Fall also eher um einen Umweg):
    // in Skript A: _meineQuelle = 1; meineOeffentlicheVariable = _meineQuelle; // für den Austausch // in Skript B: _meinZiel = meineOeffentlicheVariable;

    In dem Fall von Skript-Dateien kann man private Variablen einfach als Übergabe-Parameter übergeben.
    (Ein Dokument zu dem Thema Übergabeparameter gibt es hier)
6. Schlüsselwort „private“:
Mit dem Schlüsselwort „private“ vor einer Variable, wird (falls vorhanden) diese in dem aktuellen Bereich neu angelegt.

Das bedeutet, dass die Variable in dem aktuellen Bereich überschrieben werden kann und nach dem Ende des aktuellen Bereiches wieder auf die „alte“ Variable zugegriffen wird.

Z.B. kann es die Variable „_Wert“ geben, in welche der Wert "44" geschrieben wird.
Anschließend wird die Variable mit „private“ innerhalb eines untergeordneten Bereiches erneut angelegt und bekommt den Wert „88“.

Nachdem der untergeordnete Bereich wieder verlassen wurde, steht in der Variable nicht die „88“ sondern wieder die „44“:
_Wert = 44; if (true) then { // Neuer Bereich in Geschweiften Klammern „{ }": hint str _Wert; // Es wird eine 44 ausgegeben private _Wert = 88; hint str _Wert; // Es wird eine 88 ausgegeben }; // <- Ende des Bereiches in den Geschweiften Klammern „{ }" hint str _Wert; // Es wird eine 44 ausgegeben
Wenn man das Schlüsselwort „private“ in seinem Skript für diesen Anwendungszweck verwenden möchte, dann sollte man zur Sicherheit an jeder Stelle, wo eine Variable angelegt wird, ein „private“ Verwenden.

Das Beispiel von gerade sollte also am besten folgendermaßen aussehen:
private _Wert = 44; // <- Ein weiteres „private“ um sicher zu gehen. if (true) then { hint str _Wert; private _Wert = 88; hint str _Wert; }; hint str _Wert;
(Andernfalls kann es leicht geschehen, dass man mit der Variable aus einem vorherigen Bereich arbeitet. Besonders wenn die Variable wie in dem Beispiel den gleichen Namen hat.)
7. TAG´s:
Es ist eine gute Angewohnheit, den Namen einer öffentlichen Variable („public“) mit einem eigenen Kürzel (TAG) anzufangen.

Aufgrund der Haupteigenschaft von öffentlichen Variablen, das diese überall in der Mission bekannt sind, könnte der Name einer selbst erstellten Variable bereits vorhanden/belegt sein.

(Der Name könnte doppelt vorhanden sein)

Ohne einen TAG kann der Name entweder durch Inhalt eines anderen Erstellers hinzugekommen sein, (z.B. Kopieren eines Skripts) oder die Variable wird bereits durch das Spiel Arma 3 intern verwendet.

Ein Beispiel für so eine interne Variable währe „player“ oder „this“.

Ein TAG sollte zwischen 3 und 5 Zeichen lang sein und wird immer in Großbuchstaben geschrieben. Außerdem wird der TAG immer mit einem Unterstrich „_“ von dem restlichen Variablenamen getrennt.

Beispiele für Variablen mit einem TAG:
TAG_MeineVariable; // TAG = TAG JFR_MeineVariable; // TAG = JFR MYTAG_MeineVariable // TAG = MYTAG
Eine Ausnahme bilden die Variabel-Namen von NPCs und Objekten. Diese werden bei einer Änderung oder bei einem Kopieren vorher von dem Spiel kontrolliert.

Wenn das Spiel bemerkt, dass der Name bereits vergeben ist, dann wird das Spiel den Namen entweder automatisch umbenennen (Es wird ein „_“ + Zahl an den Namen angehangen) oder eine Warnung ausgeben.

Achtung! Eine Variable, die sich z.B. in einem Init-Feld von einem NPC befindet, wird nicht von dem Spiel kontrolliert!