randomize

2016/09/22

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

その1ではプライベート変数について見てきた。今回は2種類のパブリック変数、パブリックローカル変数と特殊パブリックローカル変数について見ていこう。「ローカル」というのはその変数はスクリプトを動かしているマシンでのみ存在し、「パブリック」というのは一度定義されたら同じマシンでいつでもどこからでも呼び出し・改変が可能ということだ。(訳注:名前がクッソガバガバなのゆるして)

パブリックローカル変数


パブリック変数にはプライベート変数と同じように通常の英数字が使える。しかしアンダースコアを頭につけることはできない(プライベート変数として認識される)。また、数字を頭に持ってくることは出来ない。123variableはダメで、variable123は使える。他にもArmaエンジンに登録されている命令や関数と同じ名前のパブリック変数は作成できない。Arma 2までは下の例のように滅茶苦茶にすることも出来たが、Arma 3からはセキュリティ上の観点から不可能になり、実行しようとするとエラーになる。
false = true;
call = "It's true!";
if (false) then {hint call}; //"It's true!"
単にmyvar = "somevar";としたとき、変数myvarはデフォルトにのっとりミッション名前空間で初期化され、ミッションが終了するまでその名前空間で存在し続ける。パブリックローカル変数をミッション中に削除するには、nilを代入する。つまりこんな感じにmyvar = nil;

パブリック関数を作成するということは、パブリックローカル変数を作ってそこに関数を代入するということだ。こうすることで同じマシンなら全てのスクリプトからその関数にアクセスできるようになる。機能を別々に分割したい時に役に立つ。単に新しい機能を作るだけなら、新しいスクリプトファイルではなく新しい関数で設定すると良い。

名前空間の話に戻ろう。ローカル変数においては、スコープの中で存在していたが、パブリックローカル変数においてはそれが名前空間の中になる。Armaには4つの名前空間があり、使い分けられる。

missionNamespace

ミッション名前空間は大きな基本の区分で、ミッションが始まった瞬間から終わる瞬間まで存在する。ミッション名前空間で定義されたすべての値は、ロビーに戻ってきた時に存在するのをやめる。もっと長い間値を保持していたいなら、別の名前空間を使おう。

uiNamespaceとparsingNamespace

この2つの名前空間はよく似た範囲を持っている。これらの名前空間で定義されたパブリックローカル変数は、定義した瞬間からArmaをシャットダウンする瞬間まで存在する。

profileNamespace

この名前空間は同じプロファイルを使用している限り値を存在させ続ける。新しいプロファイルを作成したり、切り替えたりした時に、新しいプロファイルにはその値は存在しない。名前空間に値を保存するのは自動で行われるのだが、saveProfileNamespaceで強制的に保存させる事もできる。

それで、前述のようにミッション名前空間にパブリックローカル変数を作成するには、単にmyvar = "somevar";をすれば良い。ミッション名前空間はデフォルトの名前空間だからだ。つまり普通に次のようにした場合はミッション名前空間に登録されるということだ。

with missionNamespace do {
    myvar = "somevar";
};
//上は単に下のようにしても同じ
myvar = "somevar";
他の名前空間で実行するならwith命令を使うと良い。
with uiNamespace do {};
with parsingNamespace do {};
with profileNamespace do {};
パブリックローカル変数は他の名前空間では存在しないことに注意。同じ名前で名前空間に登録しても、他の名前空間には影響を及ぼさない。プライベート変数とスコープの関係と似ている。特殊パブリックローカル変数とは違うところだ(詳細は後述)
myvar = 123;
with uiNamespace do {
    hint str (isNil "myvar"); //true
    myvar = 456;
};
with profileNamespace do {
    hint str (isNil "myvar"); //true
    myvar = 789;
};
with uiNamespace do {
    hint str myvar; //456
};
with profileNamespace do {
    hint str myvar; //789
};
hint str myvar; //123
また、setVariable命令を使ってパブリックローカル変数を作成し、getVariable命令を使って値を呼び出すことができる。これらの命令は名前空間などの対象と合わせて使う必要がある。
missionNamespace setVariable ["tro","lolol"];
//上は下と同じ
with missionNamespace do {
    tro = "lolol";
}; 
//これも同じ
tro = "lolol";
これが意味するところは特定のパブリックローカル変数の値を呼び出すとき、動的に名前を変更することができる。次の例とは別に
var1 = 1;
var2 = 2;
for "_i" from 1 to 2 do {
    private "_myvar"; //_myvarは定義する必要がある
    call compile format ["_myvar = var%1;", _i];
    diag_log _myvar;
};
こうすることもできる
var1 = 1;
var2 = 2;
for "_i" from 1 to 2 do {
    diag_log (missionNamespace getVariable (format ["var%1", _i]));
};
他の名前空間でも同じことができる。setVariablegetVariable命令について少し話そう。setVariable命令はその値をグローバルにするかどうかを設定する3つめの引数を採ることができる。これについては後で説明するとして、名前空間のパブリック変数(missionNamespace除く?情報求む)はローカルにしかなれないので、グローバルにしようとするとエラーになる。getVariable命令にはその値が未定義だった場合に使うデフォルトの値を設定する別の構文もある。
_myrank = profileNamespace getVariable ["MY_RANK", "Private"];
上の例は下の例がtrueのとき_myrank"Private"を代入する。
with profileNamespace do {
    hint str (isNil "MY_RANK"); //true(未定義)
};
名前空間の他、パブリック変数はオブジェクト、乗り物、GUI、グループ、タスク、ロケーション、チームメンバー、拠点にも設定することができる。これらには制限があり、それについては次で説明しよう。パブリックローカル変数を未定義にするにはsetVariableを使ってnilを代入するとよい。

profileNamespace setVariable ["MY_RANK", nil];

特殊パブリックローカル変数


これらの変数には特殊な値が代入されていて全ての名前空間に存在するが、各マシンに対しローカルである。あるマシンのtime変数と別のマシンのtime変数では返る値が違う。player変数は全てのマシンで別々で、サーバーマシン上ではnullが返る。変数を作るときにこれらの名前にしないようにしよう。これらの命令は私のハイライターで別の色で強調表示されている。

true false time enemy friendly sideLogic sideUnknown sideFriendly sideEnemy playerSide east west civilian resistance independent opfor blufor nil objNull grpNull netObjNull locationNull taskNull controlNull displayNull teamMemberNull player

その2はこれで終わり、変数に関して、大文字小文字の区別に関する記事も読むと良い。その3に続く。

Enjoy,
KK


0 件のコメント :

コメントを投稿

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