スクリプトコマンドのTips

目次

コピペですぐ使えるコマンド

Unitのinitialize欄用

建物へのユニット配置

this setpos (nearestBuilding this buildingPos 0);
ユニットを設置した位置に最も近い建物の0番目のポジションにユニットを設置する。監視塔が沢山ある場合などに重宝する。

ユニットの高度を指定して配置

this setpos [ getPos this select 0, getPos this select 1, (getPos this select 2) +5]
setPosの引数は3次元座標の配列。建物内部に配置する時などに使用。
この例ではマップ上でユニットを置いた地点の地面を基準にして、+5m高いところに設置している。
ArmA2では高さを指定するコマンドが幾つかあり、SetPosを使用した場合は地面から(海など水面の場合は海底からの高さ)が基準点(0m)となる。

ユニットの姿勢指定

this setUnitPos "up";
ほぼ姿勢が変わらなくなる。"DOWN","UP","Middle"を指定。

unitNameが所属するグループ全体への姿勢指定

{_x setUnitPos "UP"}forEach units group this;

ユニットが敵を発見したらAIの判断で自由に動くようにする

this setCombatMode "RED";
Waypointのengage at willと同じ。engage at willになっていないとグループリーダまたは単品で置いたユニットは動きにくくなる。
グループリーダ指揮下のユニットはどの道リーダにengage命令を受ける事が多いのであまり意味はないかもしれない。
ウェイポイントを使用したくない場合使用する。

ユニットまたはグループのBehaviour設定

this setBehaviour "COMBAT";
参考 http://community.bistudio.com/wiki/AIBehaviour
ウェイポイントのBehaviourと同じ。ウェイポイントを使用したくない場合使用する。

地点の監視をさせる

this commandWatch 3D座標;
positionはgetPosやgetMarkerPosで座標を取得する事。

地点の監視をさせる(車両用)

gunner this commandWatch 3D座標;
車両の砲塔などが自分の意図していない方向を向いている時などに。

航空機の高度下限設定

this flyInHeight 100;
ただし戦闘開始すると守るとは限らない。Behaviourが"CARELESS"なら守るが夜間だとライトが付きっ放し。

グループ名の変更

group this setGroupId ["Sierra One"];
マルチプレイではAIスロットの無効化でユニットが消えてしまうのでグループ内の全てのユニットに記述する必要がある。

乗り物に入っている武器弾薬を空にする

clearMagazineCargo this; clearWeaponCargo this;

乗車の禁止

[this] allowGetIn false;
機械化歩兵部隊などで歩兵ユニットが車両に乗って移動しようとするのを防ぐ。配列を要求されるので注意。ウェイポイントのUNLOADで下車させると下車したままになるっぽいのでそれの方が良いかも。

乗り物のカーゴへユニットを移動

this moveInCargo 車両名;
Init欄に書くとミッション開始時にvehicleNameの車両に乗車しているようになる。ほかにもDriverやGunnerのコマンドがある。Gunner席が複数あるユニットの場合はmoveInTurretを使用する事。

Gunner席が複数あるユニットへユニットを移動

this moveInTurret [車両名, [0,0]]
[0,0]の配列は1番タレットの1番目の席という意味。タレットが一つで一つの席しか持っていない場合は[0]になる。どのタレットが何番かは適当な数字を入れて試す事。

乗り物などの速度上限を指定する

this forceSpeed 10;
数値は秒速であることに注意。コンボイを組むときに役立つ。

ユニットを無敵にする

this allowDamage false;

wayPointのOnAct欄用

ウェイポイント間でグループ全体をワープさせる(歩兵のグループ用)

{_x setPos waypointPosition[group this, 2]} forEach units group this;
この場合は一つ目のウェイポイントのOnActに書く事。なおグループに車両が入っていると車両のCrewだけワープしてしまう。

ウェイポイント間でグループ全体をワープさせる(車両を含むグループ用)

{vehicle _x setPos waypointPosition[group this, 2]} forEach units group this;
上記の乗り物を含むグループ版。注意点としては下車歩兵が同じ地点にワープするので少しでも乗り物が動くと重なっている歩兵が死んでしまう事。まれに起きるので歩兵は出来るならカーゴに入れておいた方が良いかもしれない。
vehicleはもし対象のユニットが乗り物に乗っていればその乗り物の名前を返し、乗っていなければ対象のユニットをそのまま返す便利なコマンド。なので上記の例は車両を含む場合も歩兵のみの場合も両方で使える。

航空機の高度下限設定

vehicle this flyInHeight 100;
ウェイポイントのOnActでthisは乗員を返すのでvehicleが必要。

車両の燃料復活

vehicle this setFuel 1;
MoveとCycleを組み合わせて周回させる場合に使う事もある。OAになって燃料切れが結構ある。

トリガ用条件文

ミッション開始後無条件で実行

true
デフォで記述してあるthisを削除してtrueにする。

特定のプレイヤーのクライアント上なら

player == ユニット名
playerコマンドはサーバ、各クライアント上でそれぞれ結果が違うのでトリガの実行を誰かのPC上だけなど限定するのに使える。
viewDistanceやラジオで起動するトリガの表示、天候を各クライアントでばらばらにしたり等。

プレイヤーがグループリーダなら

player == leader group player
player != leader group playerならグループリーダ以外のクライアント上という事になる。

ユニットの破壊判定

!alive ユニット名
人なら死亡すれば判定できる。乗り物は完全に破壊しないと判定できない。

ユニットの破壊判定(硬い車両用)

!alive driver ユニット名
ドライバーが降車または死亡で成立する。硬い乗り物の場合はこちらを使用する事が多い。

マップ上にある建物の破壊判定

!alive( nearestObject getMarkerPos "マーカー名" )
マーカーを対象にするオブジェクトの上に置いておく事。

マップ上にある建物の破壊判定(マーカの座標だけでは上手くいかない場合)

!alive( getMarkerPos "マーカー名" nearestObject 82054 )
82054はマップ上オブジェクトのID。エディタでIDsのボタンを押すと表示される。

範囲内に特定のユニットが入ったら

ユニット名 in thisList

条件から特定のユニットを除外する

count (thisList - [ユニット名A,ユニット名B] ) > 0
配列の減算をして除外する。

範囲内のユニットが5以下なら

count thisList <= 5

特定の種別のユニットがトリガ範囲に入ったら

"Land" countType thisList > 0
"Land"が陸上。"Air"が航空など。Bisのユニットでは問題ないがクラスツリーに依存するのでaddonのユニットの場合は動かない事もあるかもしれないので確認する事。

特定のユニットの高度が100m以下なら

getPos ユニット名 select 2 <= 100

範囲内のユニットの高度が100m以下なら

{ getPos _x select 2 <= 100 } count thisList > 0
thisListの配列内にz軸の座標が100以下のユニットが1ユニットでもあればという条件。

特定の車両のエンジンが掛かったら

isEngineOn ユニット名

プレイ可能なユニット(AI含む)が全滅したら

count playableUnits == 0
シングルプレイではplayableUnitsは空の配列を返すらしいのでシングルで使ってしまうと達成しないトリガになるはず。

ミッション開始後指定した時間が経過したら

time > 時間(秒)
サーバの負荷が高い場合サーバ側の時間が遅れてしまう事があるらしい。クライアント側は正常っぽい。

サーバ上だったら

isServer
publicVariableやcreateVehicleなど複数のクライアントで実行すると不都合が生じる場合につかう。

トリガのOnAct用

トリガの範囲内に入っているユニットを全て破壊する

{ _x setDamage 1 } forEach units thisList;

トリガの範囲内に入っているユニットを全てコンバットモードにする

{ _x setBehaviour "combat" } forEach thisList;

ミッション終了時にスペクテイターを強制的に終了させる

ace_sys_spectator_exit_spectator = true;
これをENDトリガーに書いておかないと、先に死んでスペクトモードに入っている人はミッションが終了しない。

用途別コマンド解説

ユニットの操作

ユニットには様々な動作をさせる事が出来る。参考 http://community.bistudio.com/wiki/ArmA_2:_Actions

サッチェルの設置

ユニット名 fire ["pipebombmuzzle", "pipebombmuzzle", "pipebomb"];

サッチェルの爆破

ユニット名 action ["TOUCHOFF", ユニット名];

スカッド発射準備

ユニット名 action ["scudLaunch", ユニット名];

スカッド発射

ユニット名 action ["scudStart", ユニット名];

建物の操作

Barrack(かまぼこ型の兵舎)のドアを閉じる

バラックのユニット名 animate ["door", 1];

Bar gateを上げる

バーゲートのユニット名 animate ["Bargate", 0];

Bar gateを下げる

バーゲートのユニット名 animate ["Bargate", 1];

ストップ系コマンドの違い

doStop

doStop ユニット名;
グループ指揮下のユニットにストップ命令をゲーム内で出すのと同じ。敵を発見するとEngageの指示がリーダから来るため動き出す。

stop

ユニット名 stop true;
姿勢が変化するだけで動かなくなる。ACE負傷システム下でも動かない。

disableAI

ユニット名 disableAI "MOVE";
上半身は動くので発砲する。ACE負傷システム下で負傷すると逃げ回るようになるので完全に停止出来ない。

その他

ユニットを破壊する

ユニット名 setDamage 1;

ユニットにアクションメニューを追加する

数値 = ユニット名 addAction [ "メニュー名", "ファイル名.sqf" ];
マウスのホイールメニューにメニューを追加する。メニュー名に任意の文字を指定、ファイル名.sqfは実行するスクリプトファイル。戻り値は数値でアクションメニューを消す時に使用する。ここには記述しないがオプションが沢山あるコマンド。

ユニットに追加したアクションメニューを削除する

ユニット名 removeAction 数値;
数値はaddActionで取得した番号。

ラジオメニューを消す

1 setRadioMsg "Null";
1はRadioAlpha。Null以外のラジオ名を表示するとラジオが使用可能になる。

JIP対策

publicVariable "変数名";
指定した変数の値を全てのクライアントで同じ物にする。JIPでも同期される。ただし実行した時点での値で同期されるので値を更新する場合はその都度実行する必要がある。
通常はisServerと合わせて実行するのをサーバのみに限定する。ミッションの経過によりタスクの結果が消失する場合(地点の通過や占拠など)はJIPのクライアント上ではそのタスク(トリガ)は未達成になる。この場合publicVariableでそのタスクのフラグのみ同期するようにしておけばJIPのクライアントでも達成したことにする事が出来る。
逆にオブジェクトの破壊などミッション終了まで結果の残るタスクの場合はこのコマンドを使用する必要がない。
タスクの結果が消失する場合でもミッションの最後のタスクである場合はJIPを考慮しなくて良いのでやはり使用する必要がない。

マップ上でALT+左クリックした先へテレポート

condition欄をthisからtrueにして
onMapSingleClick "if ((local player) and _alt) then {(vehicle player) setPos _pos;}";
MP環境では動かないので消し忘れても安心。ロケーション探しやテストにお使いください。また、Init.sqfにonMapSingleClick以下をコピペしても使えます。

オブジェクトを沸かせる

ok = "ATV_CZ_EP1" createVehicle [(getpos player select 0)+5, getpos player select 1]
この例では、トリガが発動するとプレイヤーの東側5mの位置にATVが湧いてきます。
マルチプレイだと条件文にisServerを付けて実行しないと接続しているクライアントの数だけATVが生成されてしまうので注意。
最終更新:2012年09月19日 00:39