はじめてのミッションエディット スクリプトの基本編 -ArmA訓練所-

ArmA訓練所
2007/07/05

目次


スクリプトの基本を覚えよう

ArmAではスクリプトコマンドを使ってエディターでは出来ないような様々なことが実現可能です。
変数やデータ型、演算子の知識と組み合わせることではじめて威力を発揮します。
ここではスクリプトを使う場合の基本的なことを説明したいと思います。

ConditionとStatement

Condition

Conditionとは和訳すると条件文のことです。
トリガーのCondition欄の内容やスクリプトのif文の条件などがCondition、つまり条件文です。
条件文は常にBoolean(true/false)の値を返す必要があり、セミコロンで区切って複数の条件文を書くことは出来ません。
条件を複数重ねる場合はandやorを使います。
条件文を解釈した結果がtrueとなる場合にトリガーやif文の内容が実行されます。

Statement

Statementを和訳すると命令文のことです。
トリガーのOn Act、On Dea欄や、ウェイポイントのOn Act欄、ユニットのInitialization欄、スクリプトファイル内など、
様々な箇所で記述できる、実行される命令文のことです。
条件文のようにBoolean値を返す必要はなく、セミコロンで区切って複数の命令を書くことが出来ます。

this

書く欄によってはthisを使うことで楽に命令文を書くことが出来ます。
たとえば、ユニットを作成するときに表示されるUnit Dialogでは、
Initialization欄にthis setDamage 1と書くと、そのユニットにダメージを与えることが出来ます。
この場合のthisはそのユニットを指すObjectとして扱われます。
ユニット毎に名前を付けてunitA setDamage 1とかunitB setDamage 1と書いていくより、
thisを使って同じコマンドをコピー&ペーストした方が効率はよいでしょう。

トリガーのCondition欄にもthisは使用可能です。
トリガーの場合はデフォルトで条件はthisとなっていて、この場合は
トリガーを作成するときに表示されるTrigger Dialogで設定した条件がthisとなります。
例えば、BLUFORのユニットがこのトリガーの範囲に入ったら・・・という条件がそれです。
トリガーにおけるthisはObjectではないことに注意が必要です。
また、トリガーのConditionにthisを使わないことで、トリガーの条件をより多様にすることが出来ます。
トリガーのCondition欄にnot alive unitAとすれば、トリガーの範囲に関係なくunitAの死亡でトリガーが動作します。

thisList

トリガーのConditionやOn Act、On Dea欄ではthisListが使用できます。
これはトリガーの範囲内のActivationに該当するObjectの配列(Array)となります。
トリガーのCondition欄にunitA in thisListと書くと特定のユニットがトリガーの範囲内に入ったか調べることが出来ます。
このような使い方をする場合はActivationの設定を正しく行わないとうまく動作しないので注意しましょう。
また、On Act欄などにforEach文とthisListを組み合わせてを書くことでトリガーの範囲内のユニットに対して繰り返し処理を行うことも出来ます。

SQS形式とSQF形式

スクリプトファイルを用意するときに注意が必要なのがスクリプトの種類です。
OFPとArmAで利用できるSQS形式は、OFPの経験をそのまま生かすことが出来、記述方法も比較的楽です。
ただし、記号を多用する部分もあり、ArmAのために覚えるのはお勧めできません。
対してSQF形式はOFPレジスタンスとArmAで利用できる形式で、SQS形式にはないメリットを備えています。
SQFでは書き方がより厳格になった感じがあり、少々取っつきづらい部分もありますが、
ArmAの推奨形式でもあるため、これから覚えるのであればSQF形式で慣れてしまいましょう。
SQF形式にはSQS形式にはないメリットもあるようです。(スクリプトハンドルや最適化?)
それぞれの形式でスクリプトファイルを用意する場合は、拡張子を.sqsか.sqfにする必要があります。
SQSとSQF形式に関してはBIコミュニティのwiki等を参照した方がよいでしょう。

スクリプトファイルの実行

スクリプトファイルの実行には、他の命令文からexec(SQS形式)やexecVM(SQF形式)を使ってスクリプトファイルを実行します。
例えば、トリガーのOn Act欄に「scripthandle = [] execVM "myscript.sqf"」と書くと、
トリガーが動作したときにmyscript.sqfの中に書いた命令文が実行されることになります。

スクリプトファイルの実行は、多数のコマンドを実行したり、同じ処理を複数のユニットやタイミングで実行したい場合に効率が良くなります。
スクリプトファイルを1個書き換えるだけでユニット10人の武器の変更ができるなど、作業性の点からもお勧めできます。

スクリプトの引数(パラメータ)

スクリプトファイルを実行するときに、引数(パラメータ)を渡すことが出来ます。
[ param1, param2, param3 ]という形でexecやexecVMコマンドの前に付けます。
「scripthandle = [ param1, param2, param3 ] execVM "myscript.sqf"」のようにすると、引数を3つ渡すことが出来、
スクリプトファイル側では_thisという配列で受け取ることが出来ます。
param1は_this select 0、param2は_this select 1、param3は_this select 2でそれぞれ取得します。
あるユニットの武器を変更するスクリプトファイルの場合、"あるユニット"の部分を引数に置き換えるだけで
様々なユニットに対して再利用可能になります。

Example:

トリガーA側(On Act)
scripthandleA = [ unitA ] execVM "weapon_change.sqf"
トリガーB側(On Act)
scripthandleB = [ unitB ] execVM "weapon_change.sqf"
スクリプトファイル側(weapon_change.sqf)
_unitname = _this select 0;

removeAllWeapons _unitname;
_unitname addMagazine "30Rnd_556x45_Stanag";
_unitname addMagazine "30Rnd_556x45_Stanag";
_unitname addMagazine "30Rnd_556x45_Stanag";
_unitname addMagazine "30Rnd_556x45_Stanag";
_unitname addMagazine "HandGrenade";
_unitname addMagazine "HandGrenade";
_unitname addMagazine "HandGrenade";
_unitname addMagazine "HandGrenade";
_unitname addWeapon "M4";
_unitname selectWeapon "M4";

Homeへ