変数について

提供: macchky.wiki
2016年8月5日 (金) 06:32時点におけるMacchky (トーク | 投稿記録)による版

移動先: 案内検索

原文:Variables - Bohemia Interactive Community

変数 はデータのための箱である。一度作った変数は参照したり、改変することが出来る。

前提知識

下記のリンクはこの記事を理解するのに必要な基礎を紹介しています。

初期化

まずはじめにあなたがしなければいけないことは、変数の名前を決めることです。この名前は 識別子 と言います。

名前を決めたら、ゲームエンジンにこの識別子を使うことを知らせなければなりません。これを 初期化 と言います。そしたら今変数に対して何でもできるようになります。

心配しないで: 大袈裟に聞こえるかもしれませんが、初期化は変数に値を割り当てるだけで出来ます。

myVariable = 0;

未定義もしくは初期化されていない変数にアクセスしようとすると nil を返します (未定義値)。str コマンドで 未定義な変数を 文字列 に変換しようとすると常に scalar bool array string 0xe0ffffef (in Armed Assault) or scalar bool array string 0xfcffffef (in Operation Flashpoint) を返します。

myString = str(undefinedVar);

myString => "scalar bool array string 0xe0ffffef"

このように変数は初期化しないと、どんな 操作 も出来ません。

Deletion

Once created, variables will take up space in your computer memory. This is not drastic for small variables, but if you use a big number of very large variables, you should undefine any variables that are not needed anymore. This can be done with the command nil.

hugeVariable = nil;

This effectively destroys a variable as if it had never existed.

Namespace

Variables are only visible in certain areas (namespaces) of the game. This prevents name conflicts between different variables in different scripts.

There are three namespaces:

local
A variable is only visible in the script in which it was defined.
global
A variable is visible on the whole computer where it is defined.
public
A variable is broadcasted over the network and visible on all computers connected to the network.

Local Variables

Local variables are only visible in a specific script. The whole code in this script has access to the variable, that includes also functions called within the script.

The identifier of variables local to a script always has to start with an underscore.

_myLocalVariable = 0;

In functions you should additionally mark variables as local using the command private. Otherwise you may modify local variables of the calling script that are visible in the function.

private "_myLocalVariable";
_myLocalVariable = 0;

You may also pass more identifiers to the private command using an Array.

private ["_myLocalVariable1", "_myLocalVariable2", ...];

Global Variables

Global variables are visible on the whole computer where they are defined. Names given to units in the Mission Editor are also global variables pointing to those units, which may not be redefined or modified.

Identifiers of global variables must not start with underscore. Otherwise there are the same rules as for all identifiers.

myGlobalVariable = 0;

Public Variables

Public variables are global variables that are visible on all computers in the network. You can never have true public variables, but you can emulate their behaviour.

The value of a global variable gets broadcasted over the network using publicVariable. After the call of this command the variable will have the same value on all clients. Once you modify the variable though you have to broadcast it manually again with publicVariable.

Scope

If a local variable is initialized within a Control Structures (i.e. if, for, switch, while) its scope will stay within this structure (i.e. outside of the structure it will still be seen as undefined). This does not apply to global or public variables. if (alive player) then {_living=true}; hint format["%1",_living]; Returns "scalar bool array string 0xe0ffffef", since the local variable was not initialized before being used within a control structure.

_dead=true; if (alive player) then {_dead=false}; hint format["%1",_dead]; Returns "false", since the variable was initialized before the if...then.
To initialize local variables, so that they are available throughout the whole script (including any control structures), either initialize it via the private command (e.g. private ["_varname"];), or by assigning a default value to it (e.g. varname=0;).

Data Types

Variables may store certain values. The kind of the value specifies the type of the variable. Different operators and commands require variables to be of different types.

Read the article Data Types for more information about variable types.

Multiplayer Considerations

Storing vars and functions into global vars without securing them with compileFinal is a very bad practice in MP. Basically, if you have a script installed on a server in mission file that uses functions stored in unprotected variables then hackers can overwrite that function attached to a global variable and make it execute code for everyone and do a lot of nasty stuff. So please put all of the code for each function in a SEPARATE file and initialize them like this: myGlobalVarFunction = compileFinal preprocessFileLineNumbers "Dir\where\function\is\fnc_globalVarFunction.sqf"; That way, the function can be called and spawned without it being subject to hackers that attempt to overwrite the global variable "myGlobalVarFunction".

Everyone happy :)

See also