randomize

2016/08/23

Killzone KidのArmaスクリプト講座:変数(その1)

Armaには5種類の変数がある: プライベート変数、特殊プライベート変数、パブリックローカル変数、特殊パブリックローカル変数、パブリックグローバル変数(訳については深い意味は無いしガバガバなんで気にしないでください)。それぞれ違う範囲があるので、それを知っておこう。


プライベート変数


エンジンはアンダースコア(_)で始まる値を自動的にプライベート変数と解釈する。通常の英数字A~Z、a~z、0~9と_が値の名前に使える。ということで_hello_HELLO_WORLD2000_____hello_123____123_______helloは全て使用できるし、プライベート変数として解釈される。プライベート変数はスコープ(訳注:スコープ scopeは{}の中身だと思っていただければ大体間違いはないと思います)の中で定義されたとき、スコープが終了した時に削除される。従ってスコープ内のプライベート変数はスコープの外では未定義だ。
//_iは未定義、nil
if true then { //スコープ開始
    _i = 1; //_iを定義
    //_iは1
}; //スコープ終了
//スコープが終了したためここでは_iは未定義
プライベート変数が定義された親スコープの中の子、孫、ひ孫…スコープ内において、プライベート変数は定義されたままだ。つまり子スコープ内でプライベート変数を操作し、その値を親スコープに送りたければ、その前に親スコープでプライベート変数が定義されていることを確かめておこう。
_i = 1;
if true then {
    //_iは1、定義済
    if true then {
        //_iは1、定義済
        if true then {
            //_iは1、定義済
        };
    };
};
でも特定のプライベート変数を子スコープ内で使わないようにするとき何を使えば良いか?こういう時はprivate命令の出番だ。一つの変数を定義することも配列で複数定義することも出来る。
private "_a"; 
private "_b"; 
private "_c"; 
//上は下と同じ
private ["_a","_b","_c"];
privateは、親スコープで定義された同名のプライベート変数には影響を及ぼさず、その子スコープ内で定義されるまで未定義とする命令だ。
hint format ["%1", _i]; //"any"(=未定義)
_i = 1;
hint format ["%1", _i]; //"1"
if true then {
    hint format ["%1", _i]; //"1"
    private "_i";
    hint format ["%1", _i]; //"any"(=未定義)
    _i = 2;
    hint format ["%1", _i]; //"2"
};
hint format ["%1", _i]; //"1"

特殊プライベート変数


この記事を見てほしい。特定の命令を実行した時、命令スコープ内でしか存在できない特殊変数を作成し命令の特殊値を代入する。スコープ内でしか存在できないのはエンジンは変数を作成するときにprivateを実行するためだ。
//最初のループにおいて
{
    {
        hint str _x; //_xは1
    } forEach _x; //_xは[1,2,3]
} forEach [[1,2,3],[4,5,6],[7,8,9]];
ご覧のとおり、親ループと子ループで_xは異なっている。これにより入れ子ループが安全なものになっている。ところで、親ループの_xの中身を子ループに渡したいときは、別の変数に代入して渡すと良い。
//最初のループにおいて
{ 
    _x2 = _x;
    {
        hint str _x; //_xは1
        hint str _x2; //_x2は[1,2,3]
    } forEach _x; 
} forEach [[1,2,3],[4,5,6],[7,8,9]];
特殊プライベート変数について、同名のプライベート変数を作成しないようにすること以外特に説明することはない。またその1のまとめとして、(特に理由がない限り)必要以上に明示的にスクリプトをプライベートにしてもバチは当たらない。call命令で関数を呼びだすときなら(訳注:callの内外でうっかり値を変更しないように)なおさらだ。プライベート変数出力機はそのためのプログラムだ。
_function = {
    _var = _var + 1;
};
_var = 10;
call _function;
hint str _var; //_varは11

_var = 100; //_varは別の場所で定義済
function = {
    private "_var";
    _var = _this select 0;
    _var = _var + 1;
    _var
};
hint str ([10] call function); //返り値は11、_varは100のまま
その1は終わり、その2もあるよ。

Enjoy,
KK


0 件のコメント :

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。