arma3でチキンクリスプ食べながらスクリプト

arma3のエディッタ向けスクリプトを自分用に投稿

Arma3のローカル変数とグローバル変数についてよく違いが分からない人

例によってスクリプトとか始めてみたい人向けのやつ
何かしらのプログラミングに触ったことある人とかプログラミング経験者は読んでも鼻で笑う内容なので読む価値なし

アンダースコアとかアンダーバーと呼ばれる記号「_」で始まるのがローカル変数
記号から始まらないのがグローバル変数

以上で説明はだいたい終わるけどもうちょっと詳しい説明を

スクリプトを書くと必ず使用するのがこの変数
ローカル変数とグローバル変数

ローカル変数とは
銀行や郵便局に行くと発券する受付番号のようなもの
とりあえず番号を振っておいて処理するときは発行した番号を呼ぶ
用事が終わったら番号は使い捨てる
銀行で割り振られた受付番号が郵便局で使えないようにローカル変数を別のスクリプに引き継ぐことはできない


例えば
とあるトリガーAでAMV-7を作成し、別のトリガーBでプレイヤーの乗ったAMV-7にスラットアーマーを取り付けるスクリプトを作りたいとする
トリガーAで車両に_vehというローカル変数を使って生成する
トリガーBで_vehというローカル変数にスラットアーマーを取り付ける
以下がその簡単な例

//AMV-7をプレイヤー位置に作成するスクリプト
_veh = createVehicle ["B_APC_Wheeled_01_cannon_F",position player,[],0,"NONE"];
//AMV-7にスラットアーマーを取り付けるスクリプト
[_veh,["Sand",1],["showBags",0,"showCamonetHull",0,"showCamonetTurret",0,"showSLATHull",1,"showSLATTurret",1]] call BIS_fnc_initVehicle;

一見このスクリプトは機能しそうだが実際には動作エラーを起こす
トリガーAで使った_vehというローカル変数はトリガーAの処理が終わった時点で破棄されてしまうからだ
トリガーBで使われている_vehというローカル変数はトリガーB独自のローカル変数になっているので、このトリガーBの処理において_vehというローカル変数が何を指しているのか未定義なのでエラーを引き起こしてしまう

したがってトリガーBで使うローカル変数_vehに必要なデータを入れる必要がある

//AMV-7にスラットアーマーを取り付けるスクリプトの修正
_veh = vehicle player;
[_veh,["Sand",1],["showBags",0,"showCamonetHull",0,"showCamonetTurret",0,"showSLATHull",1,"showSLATTurret",1]] call BIS_fnc_initVehicle;

ここでローカル変数_vehにプレイヤーが乗る車両を入れている
もちろんプレイヤーがAMV-7に乗っていなかったらエラーを出す


グローバル変数とは
個人に付けられたフルネームとほぼ同じ、どこでもフルネームを呼ぶことが出来る
同じ名前のグローバル変数を複数のものに使うことは出来ない
例えばKerryというグローバル変数を使えば一度スクリプトが終了しても別のスクリプトでKerryを使う必要があるときはKerryという変数をそのまま使うことができる



どのように使い分けるべきか
ローカル変数はいくつ被っても基本的に問題は無いが、グローバル変数は一つ一つ違うものでないといけない

大量に同じものを作る時はローカル変数が使いやすい
例えば、プレイヤーが生きている間10秒ごとにライフル兵をプレイヤーの位置に生成するスクリプトを作るようなスクリプトの場合

while{alive player}do{
_Rifleman = createVehicle [""B_Soldier_F"",position player,[],0,"NONE"];
sleep 10};

しかしグローバル変数は被ってはいけないので独自に割り振る必要がある

waitunti{sleep10; true};
if(alive player)then{
Rifleman01 = createVehicle [""B_Soldier_F"",position player,[],0,"NONE"];};

waitunti{sleep10; true};
if(alive player)then{
Rifleman02 = createVehicle [""B_Soldier_F"",position player,[],0,"NONE"];};

waitunti{sleep10; true};
if(alive player)then{
Rifleman0 = createVehicle [""B_Soldier_F"",position player,[],0,"NONE"];};


逆に別のスクリプトで時間をおいて使う必要があるときはグローバル変数が使いやすい