「変数について」の版間の差分

提供: macchky.wiki
ナビゲーションに移動 検索に移動
 
9行目: 9行目:
  
 
* [https://community.bistudio.com/wiki/ArmA:_Introduction_to_Scripting ArmA: Introduction to Scripting]
 
* [https://community.bistudio.com/wiki/ArmA:_Introduction_to_Scripting ArmA: Introduction to Scripting]
* [[識別子]]
+
* [[演算子について]]
  
 
== 初期化 ==
 
== 初期化 ==
29行目: 29行目:
 
このように変数は初期化しないと、どんな [[演算子|操作]] も出来ません。
 
このように変数は初期化しないと、どんな [[演算子|操作]] も出来ません。
  
== 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]].
+
変数が作られると、あなたのPCのメモリを食います。小さい変数なら気にすることでもないですが、大量に大きな変数を使う際は必要なくなった変数を解放すべきです。これは [[nil]] コマンドを代入することで出来ます。
  
 
  hugeVariable = nil;
 
  hugeVariable = nil;
  
This effectively destroys a variable as if it had never existed.
+
== 名前空間 ==
  
== Namespace ==
+
変数はゲーム内の特定のエリア(名前空間)でしか見えません。これは別の [[Script (File)|scripts]] 間での名前の衝突を防ぎます。
  
Variables are only visible in certain areas (namespaces) of the game. This prevents name conflicts between different variables in different [[Script (File)|scripts]].
+
ARMA3には3つの名前空間が有ります
  
There are three namespaces:
+
; local ローカル
 +
: 変数は定義された [[Script (File)|script]] 内でしか見えない。
  
; local
+
; global グローバル
: A variable is only visible in the [[Script (File)|script]] in which it was defined.
+
: 定義されたコンピュータ内全体で見える。
  
; global
+
; public パブリック
: 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 ===
+
ローカル変数は特定の [[Script (File)|script]] 内だけで見える。そのスクリプト内のすべてのコードから変数にアクセスでき、スクリプト内から呼ばれた [[関数について|関数]] も含まれる。
  
Local variables are only visible in a specific [[Script (File)|script]]. The whole code in this script has access to the variable, that includes also [[Function|functions]] called within the script.
+
[[Script (File)|script]] に対してローカルな変数の [[識別子]] は常にアンダースコアからはじめなければいけません。
 
 
The [[identifier]] of variables local to a [[Script (File)|script]] always has to start with an underscore.
 
  
 
  _myLocalVariable = 0;
 
  _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]] コマンドを使って変数をローカルに指定すべきです。さもないとその関数を呼んだスクリプト内のローカル変数を改変してしまうでしょう。
  
 
  private "_myLocalVariable";
 
  private "_myLocalVariable";
 
  _myLocalVariable = 0;
 
  _myLocalVariable = 0;
  
You may also pass more [[Identifier|identifiers]] to the private command using an [[Array]].
+
[[配列]] を使って2個以上の [[識別子]] を private コマンドに入力できます。
  
 
  private ["_myLocalVariable1", "_myLocalVariable2", ...];
 
  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.
+
グローバル変数は定義されたコンピュータ内全体から見える変数です。ミッションエディタ内でユニットに与えた名前もまたそのユニットを示すグローバル変数となり、再定義・改変してはいけないものです。
  
[[Identifier]]s of global variables ''must not'' start with underscore. Otherwise there are the same rules as for all [[Identifier|identifiers]].
+
グローバル変数の [[識別子]] はアンダースコアからはじめては ''いけません''
  
 
  myGlobalVariable = 0;
 
  myGlobalVariable = 0;
  
=== Public Variables ===
+
=== パブリック変数 ===
 +
 
 +
パブリック変数はグローバル変数がネットワーク内のすべてコンピュータ上で見えるようになったものです。とは言え、ARMA3では本当の意味でのパブリック変数はありません、が同じように真似ることは出来ます。
  
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.
+
[[publicVariable]] コマンドを使うことでグローバル変数をネットワーク上に伝えることが出来ます。このコマンドを使われると変数は全ての [[クライアント]] で同じ値となります。変数を再度改変した場合は''もう一度''手動で [[publicVariable]] を使って全てのクライアントに伝えなければいけません。
  
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 [[Client|clients]]. Once you modify the variable though you have to broadcast it manually ''again'' with [[publicVariable]].
+
== スコープ ==
 +
ローカル変数が [[制御構文について|制御構文]] (すなわち. [[if]], [[for]], [[switch]], [[while]]) 内で初期化された場合、そのスコープはその構文の'''中に'''留まります。(すなわち その構文の外では未定義として扱われる)。これはグローバル変数やパブリック変数には適応されません。
  
== 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.
 
 
<code>if (alive player) then {_living=true}; hint format["%1",_living];</code>
 
<code>if (alive player) then {_living=true}; hint format["%1",_living];</code>
 +
 
Returns "scalar bool array string 0xe0ffffef", since the local variable was not initialized ''before'' being used within a control structure.
 
Returns "scalar bool array string 0xe0ffffef", since the local variable was not initialized ''before'' being used within a control structure.
  
<code>_dead=true; if (alive player) then {_dead=false}; hint format["%1",_dead];
+
<code>_dead=true; if (alive player) then {_dead=false}; hint format["%1",_dead];</code>
</code>
+
 
 
Returns "false", since the variable was initialized before the if...then.<br>
 
Returns "false", since the variable was initialized before the if...then.<br>
 
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;'').
 
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|operators]] and [[:Category:Scripting Commands|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.
 
Storing vars and functions into global vars without securing them with compileFinal is a very bad practice in MP.
110行目: 110行目:
 
== See also ==
 
== See also ==
  
* [[Data Types]], [[Magic Variables]]
+
* [[データ型について|データ型]], [[Magic Variables]]
  
 
[[Category: Scripting_Topics]]
 
[[Category: Scripting_Topics]]

2016年8月5日 (金) 07:49時点における最新版

原文: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"

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

削除

変数が作られると、あなたのPCのメモリを食います。小さい変数なら気にすることでもないですが、大量に大きな変数を使う際は必要なくなった変数を解放すべきです。これは nil コマンドを代入することで出来ます。

hugeVariable = nil;

名前空間

変数はゲーム内の特定のエリア(名前空間)でしか見えません。これは別の scripts 間での名前の衝突を防ぎます。

ARMA3には3つの名前空間が有ります

local ローカル
変数は定義された script 内でしか見えない。
global グローバル
定義されたコンピュータ内全体で見える。
public パブリック
ネットワークに接続された全てのコンピュータで見える。

ローカル変数

ローカル変数は特定の script 内だけで見える。そのスクリプト内のすべてのコードから変数にアクセスでき、スクリプト内から呼ばれた 関数 も含まれる。

script に対してローカルな変数の 識別子 は常にアンダースコアからはじめなければいけません。

_myLocalVariable = 0;

関数の中では加えて private コマンドを使って変数をローカルに指定すべきです。さもないとその関数を呼んだスクリプト内のローカル変数を改変してしまうでしょう。

private "_myLocalVariable";
_myLocalVariable = 0;

配列 を使って2個以上の 識別子 を private コマンドに入力できます。

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

グローバル変数

グローバル変数は定義されたコンピュータ内全体から見える変数です。ミッションエディタ内でユニットに与えた名前もまたそのユニットを示すグローバル変数となり、再定義・改変してはいけないものです。

グローバル変数の 識別子 はアンダースコアからはじめては いけません

myGlobalVariable = 0;

パブリック変数

パブリック変数はグローバル変数がネットワーク内のすべてコンピュータ上で見えるようになったものです。とは言え、ARMA3では本当の意味でのパブリック変数はありません、が同じように真似ることは出来ます。

publicVariable コマンドを使うことでグローバル変数をネットワーク上に伝えることが出来ます。このコマンドを使われると変数は全ての クライアント で同じ値となります。変数を再度改変した場合はもう一度手動で publicVariable を使って全てのクライアントに伝えなければいけません。

スコープ

ローカル変数が 制御構文 (すなわち. if, for, switch, while) 内で初期化された場合、そのスコープはその構文の中に留まります。(すなわち その構文の外では未定義として扱われる)。これはグローバル変数やパブリック変数には適応されません。

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

データ型

変数は特定の値を格納し、値の種類によって変数の が決まります。演算子やコマンドによって異なる型の変数が必要となります。

詳しくは データ型 記事参照。

マルチプレイヤーでの留意事項

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