ARMA 3 JPN MENTAIKO COOP SERVER @wiki

スクリプトコマンド

最終更新:

arma3mentaikocoop

- view
メンバー限定 登録/ログイン
最終更新日 : 2021年03月14日

スクリプトコマンド

スクリプトコマンドは、Arma 3で使用可能なプログラミング関数です。
Arma 3はSQFという独特なプログラミング言語を使用しています。
また、複雑なスクリプトを簡単に呼び出す手段として、ファンクションが用意されています。

スクリプトコマンドリスト
Arma 3 Scripting Commands Arma 3
Arma_3:_Functions
CBA Community Base Addons



テキストエディター

スクリプトファイルなどを編集するのに便利なテキストエディターです。
ハイライト機能やオートコンプリート(入力補完)機能、構文チェック機能などがあります。
どれも非常に優秀ですので、好きなものを使用して下さい。

TypeSQF Editor

 ▶ 配布元: TypeSQF

SQFに特化した専用テキストエディタ
特に設定することなく使用できるので、初心者におすすめ。
構文の間違いをチェックする機能があるので、自分が編集したスクリプトが構文的に正しいかどうかを確認するのに便利。

Atom

 ▶ 配布元: Atom
 ▷ SQFプラグイン

GitHubが開発したオープンソースのテキストエディタ

Notepad++


オープンソースで開発されているテキストエディタ

Visual Studio Code


Microsoftが開発しているテキストエディタ


演算記号

演算子はTriggerの条件やスクリプトで使用します。

コマンド 意味 使用例 リンク
! 否定 (Aではない) !A ! a
+ 足す A + B +
- 引く A - B -
* 掛ける A * B a * b
/ 割る A / B a / b
^ べき乗 A ^ B a ^ b
% AをBで割った余り A % B a % b
= 代入 A = B a = b
== AとBが等しい a == b a == b
!= AとBが等しくない A != B a != b
> AがBより大きい A > B a greater b
>= AがB以上 A >= B a greater= b
< AがBより小さい A < B a less b
<= AがB以下 A <= B a less= b
&& AかつB A && B a && b
|| AまたはB A || B a or b

AIユニットの制御

AIの特定動作を無効化する - disableAI

AIユニットの特定の動作を無効化させる
気絶から回復後は無視されてしまうのに注意。

構文
ユニット disableAI "選択項目";

MOVE
AIユニットの移動を無効化する。
下半身が固定されるため、回転も無効化される。
this disableAI "MOVE";

PATH
移動を停止する
こちらは回転が可能
this disableAI "PATH";

AUTOTARGET
未識別の目標をターゲットとして割り当てるのを無効化する
目視で敵と認識したものに対しては攻撃をする
this disableAI "AUTOTARGET";

TARGET
目標に対して攻撃することを無効化する
this disableAI "TARGET";

COVER
遮蔽物に隠れるなどの回避行動を無効化する
this disableAI "COVER";

AUTOCOMBAT
危険察知時にコンバットモードが自動で切り替わるのを無効化する
this disableAI "AUTOCOMBAT";

FSM
AIの行動制御スクリプトを無効化し、行動を鈍化させる
this disableAI "FSM";

AIの特定動作を有効化する - enableAI

AIユニットのdisableAIで無効化した動作を有効にする。
構文
ユニット enableAI "選択項目";
例文
this enableAI "MOVE";

AIの姿勢を制御する - setUnitPos

AIユニットの姿勢を制御する。
気絶から回復後は無視されてしまうのに注意。

屋内や屋上にAIを配置するときは、AIが伏せないように指定すること。
伏せたAIは床を無視して射撃してしまうことがある。

DOWN
ユニットを匍匐(ほふく)姿勢に変更し、それを維持する
this setUnitPos "DOWN";

UP
ユニットを立ち上がらせ、それを維持する
this setUnitPos "UP";
MIDDLE
ユニットを膝立ち姿勢に変更し、それを維持する
this setUnitPos "MIDDLE";

AUTO
ユニットが状況に応じた姿勢に自動で変更する
this setUnitPos "AUTO";

AIが走らないようにする - forceWalk

AIの移動速度を歩きに強制します。

構文
ユニット forceWalk "モード";
例文
this forceWalk true;

AIのスキルを設定する - setSkill

AIのスキルを設定します。
スキルの詳細については Arma 3 AI Skill を御覧ください。

ジャングル戦や夜戦では、プレイヤーのストレス軽減にもAIスキルの調節をすることをおすすめします。

構文
ユニット setSkill [スキルネーム,(01)];

general
基本となるスキルの設定値
定義されない個別項目にはこの設定値が反映されます。
  • 値の例
    • 初心者 : 0.25以下
    • 新 兵 : 0.25 より大きく 0.45 以下
    • 一般兵 : 0.45 より大きく 0.65 以下
    • ベテラン : 0.65 より大きく 0.85 以下 
    • エキスパート : 0.85 より大きい
this setSkill ["general", 0.5];

aimingAccuracy
AIの照準精度(偏差射撃、弾道落下、ブレの補正、反動制御)の設定値
  • 設定値は0.1~0.2ぐらいで人間並みの精度になる
  • 密林などの視界制限の激しい場所では0.08程度まで下げることを推奨
this setSkill ["aimingAccuracy", 0.12];

courage
AIの士気レベル
値が大きいほどAIは勇猛果敢になる
this setSkill ["courage", 0.8];

commanding
AIの指揮速度
値が大きいほど情報共有が早くなります
this setskill ["commanding",0.75];

aimingShake
AIの手ブレを設定する
値が大きいほど手ブレが少なくなる
this setskill ["aimingShake",0.4];

aimingSpeed
AIの照準速度を設定する
this setskill ["aimingSpeed",0.6];

spotDistance
AIがターゲットを発見する距離と、ターゲットの詳細を把握する正確さを設定する
値が大きいほど長距離の敵を発見しやすく、情報の確度も高くなる
this setskill ["spotDistance",0.6];

spotTime
ターゲットを発見するまでの時間と、味方の死体や負傷を認識するまでの時間を調節する
値が大きいほど認識までの時間が短くなる
this setskill ["spotTime",0.45];

AIの戦闘モードの制御 - setCombatMode

AI グループの戦闘モード(交戦規定)を設定する
戦闘モードの詳細については Combat Modes を御覧ください

構文
ユニットまたはグループ setCombatMode モード

BLUE
発砲禁止、交戦禁止
  • 発砲を全面的に禁止される
  • フォーメーションを維持する
  • グループの隊員は、撃たれたとしても撃ち返さない
  • グループの隊員は、敵対ユニットを発見したときに追跡や回避を行う
グループリーダーのみにコマンドを与えるとき
group this setCombatMode "BLUE";
個々のユニットにコマンドを与えるとき
this setCombatMode "BLUE";
以下同様

GREEN
反撃のみ、統制戦闘
  • リーダーの判断で自衛戦闘のみを行う
  • フォーメーションを維持する
group this setCombatMode "GREEN";

WHITE
反撃のみ、自由交戦
  • 各自の判断で自衛戦闘のみを行う
  • フォーメーションを維持しない
group this setCombatMode "WHITE";

YELLOW
発砲規制無し、統制戦闘(デフォルトのモード)
  • 有効範囲内の任意の敵ユニットに対して発砲する
  • グループリーダーがターゲットを指定した場合、フォーメーションを崩すことなく交戦する
group this setCombatMode "YELLOW";

RED
発砲規制無し、自由交戦
  • 各自の判断で交戦し、発砲する
  • 各自の判断でフォーメーションを離脱し、交戦に最適な場所に移動する
group this setCombatMode "RED";

AIの警戒モードの設定 - setBehaviour

AIの警戒モードの設定をする
警戒モードについての詳細は AI Behaviour を御覧ください

構文
ユニットまたはグループ setBehaviour "モード"

No Change
現在の警戒モードを維持する

Careless
無警戒状態。
  • ユニットは全く警戒せず、非戦闘的な行動をする
    • 戦闘フォーメーションを取らず、銃を下ろし、ゆっくりと歩く
  • 接敵しても戦闘モードを変化しない
  • 歩兵ユニットは、負傷しない限り発砲しない
  • 車両ユニットは、敵に対して発砲する
  • 移動時は、可能な限り道路を利用する
group this setBehaviour "Careless"

Safe
Carelessに似ているが、こちらは戦闘モードを自動で変更する
group this setBehaviour "Safe"

Aware
デフォルトの警戒モード
  • ユニットは戦闘歩調などを駆使しながら移動し、遮蔽物も利用する
  • 移動は基本的に道路を利用する
  • 車両はライトを消す
  • 交戦エリア内に敵がいる場合、後部座席の兵員は車両から降りる
  • グループのメンバー同士で交互前進を行う
group this setBehaviour "Aware"

Combat
Awareよりも強力な警戒モード
  • 移動は道路よりも遮蔽を優先して行う
  • 停止時は姿勢を低くする
  • カバーや警戒に費やす時間が多くなる
  • 情報交換間隔が短くなる
  • グループの一部のメンバーを斥候として送り出すことがある
group this setBehaviour "Combat"

Stealth
隠密行動
  • 移動は道路よりも遮蔽を優先して行う
  • 敵を認識した場合、可能な限り接近する
  • 遮蔽のない地域では斥候とカバーを駆使しつつ移動する
  • 車両は道路での移動を優先するが、兵員輸送はしない
  • 重車両は木を倒すなどの行動をしない
group this setBehaviour "Stealth"

警戒モードによるAIの移動ルートの変化


AI車両の制御

車両の速度制限 - limitSpeed

AIが操縦する車両に速度制限を与える
プレイヤーに対しては無効

構文
車両オブジェクト limitSpeed 速度(km/h)
例文
this limitSpeed 50;

車両の速度制限 - flyInHeight

AIが操縦する航空機に高度制限(下限)を与える。

構文
航空機オブジェクト flyInHeight 対地高度(m)
例文
this flyInHeight 50;

オブジェクトの状態を設定する

オブジェクトにダメージを与える - setDamage

オブジェクトのダメージ量を設定します
  • 0 : 完全な状態(ダメージ0)
  • 1 : 死亡した・破壊された状態
構文.1
オブジェクト setDamage ダメージ量(01);
構文.2
オブジェクト setDamage [ダメージ量、エフェクトの有無(true, false)] ;

例文.1 オブジェクトの完全回復
this setDamage 0;
例文.2 爆発エフェクトをスキップして破壊状態にする
this setDamage [1, false];

オブジェクトの被ダメージの有効無効を設定 - allowDamage

オブジェクトが被ダメージを受けるかどうかを設定する
このコマンドは、他のコマンドによる被ダメージを防ぐことはできない

構文
オブジェクト allowDamage 有効無効(true, false);

例文. オブジェクトの被ダメージを無効化
this alloDamage false;

オブジェクトにアクションを追加する - addAction

addActionはオブジェクトにアクションをアタッチする

このコマンドはLocalのみで実行される。

構文
オブジェクト addAction [タイトル, スクリプト, 引数, 優先度, 文字表示, 使用後に隠す, ショートカットキー, 表示条件, 表示半径, 気絶状態での使用]
タイトル アクションのタイトル
スクリプト アクション選択後に実行されるスクリプト
引数 スクリプトに渡される引数
優先度 表示される優先度 (数値が高いほど上に表示される)
画面表示 画面中央にアクションタイトルを表示するか否か
使用後に隠す アクション使用後に非表示にするか否か
ショートカットキー アクションを使用するためのショートカットキー
表示条件 アクションが表示されるための条件
_target: アクションがアタッチされたオブジェクト
_this: アクションを呼び出すユニット
表示半径 アクションを表示される、オブジェクトからプレイヤーまでの距離
気絶状態での使用 プレイヤーの気絶時にアクションを利用できるかどうか

スクリプトに渡されるパラメータ
  • params ["_target", "_caller", "_actionId", "_arguments"];
    • target (_this select 0) : アクションがアタッチされたオブジェクト
    • caller (_this select 1) : アクションを呼び出すユニット
    • actionId (_this select 2) : アクションのID
    • arguments (_this select 3) : 引数

例文.1
this addAction ["メモを見る",{hint "犯人はヤス"}];

例文.2 車両オブジェクトに対して
// 車両のドライバーなら自爆できるようにする
this addAction [
	"自爆スイッチ",
	{hint "ポチッとな"; (_this select 0) setDamage 1;},
	[],
	1.5,
	true,
	true,
	"",
	"driver _target == _this"
]; 

例文.3 スクリプトファイルの呼び出し
this addAction [
	"Delete This!",
	"delete.sqf"
]; 
delete.sqf
// ミッションフォルダにdelete.sqfを作成して以下のコマンドを入力する。
deleteVehicle _this select 0;

オブジェクトにArsenalを追加する - BIS_fnc_arsenal

オブジェクトにArsenalを追加する

使用例
this addAction ["Arsenal",{["Open",true] call BIS_fnc_arsenal;}];


文字や演出を表示するコマンド

シンプルに文字を表示する - hint

画面にメッセージを通知音とともに表示する。
  • 通知音が不要な場合は hintSilent を使用する(詳細下記)
  • 改行は\nで行う
構文
hint "メッセージ";
メッセージは、コマンドが実行されたクライアントコンピューター上のみで表示される。
メッセージを他のクライアント上にも表示する場合は remoteExec を使用する。
["Hello everyone!"] remoteExec ["hint",-2];

通知音無しで文字を表示する - hintSilent

画面にメッセージを通知音無しで表示する。
音声を再生しないので処理が軽い。

構文
hintSilent "メッセージ";

例文1
hintSilent format ["Hello, %1!", name player];
例文2 メッセージを5秒で閉じる
hint "Hello there!";
sleep 5;
hintSilent "";

変数を含む文字列を作成する - format

構文
format ["%1, %2",_var1,_var2];
%1に_var1を、%2に_var2を代入する。

例文
hint format ["Your name is %1.", name player];

時間をスキップする - skipTime

指定した時間だけ、時刻を前もしくは後ろにスキップする(一時間単位)。
構文
skipTime 時間;

このコマンドはサーバー上で実行された場合は、すべてのクライアントと同期される。
しかし、サーバー上のクランアントが実行した場合は、クライアント上でのみ実行され、5秒後にサーバー時間に再度同期される。
他のクライアントにも時間を同期させるためには remoteExec を使用する。
6 remoteExec ["skipTime", 2]; 


条件分岐

if

結果が真偽で分かれるようなシンプルな場合分け使用する

構文.1
if (条件式) then {処理};
条件式が真(true)であれば処理を実行する。

構文.2
if (条件式) then {処理1} else {処理2};
条件式が真(true)であれば処理1を実行し、偽(false)であれば処理2を実行する。

例文
Score = 85;
 
if (Score >= 80) then {
	hint "あなたは合格です";
} else {
	hint "あなたは不合格です";
}; 
結果
あなたは合格です

switch do

パターンが多数存在する場合分け処理に使用する

構文
switch () do {
	case 結果1 : {処理1}
	case 結果2 : {処理2}
	case 結果3 : {処理3}default {例外処理}
}; 
式の結果のパターンに対応した処理を実行する。
結果1であれば処理1を実行し、結果3であれば処理3を実行する。
式の結果がどの結果にも当てはまらない場合は、defaultの例外処理を実行する。

例文
private _color = "yellow";
 
switch (_color) do {
	case "red": {
		hint "あなたはアカレンジャイです";
	};
 
	case "blue": {
		hint "あなたはアオレンジャイです";
	};
 
	case "yellow": {
		hint "あなたはキレンジャイです";
	};
 
	case "pink": {
		hint "あなたはモモレンジャイです";
	};
 
	case "green": {
		hint "あなたはミドレンジャイです";
	};
 
	default {
		hint "あなたはドクロ仮面です";
	};
}; 
結果
あなたはキレンジャイです

exitWith

構文
if (条件) exitWith {処理};
条件が満たされた場合、現在のスコープを終了し、新しいスコープで処理を実行する。

例文.1
if (!isServer) exitWith {}; 
サーバーではないコンピュータ上(クライアントなど)で実行された場合、何もせずに終了する。
サーバーのみで実行するスクリプトの1行目などに書かれる。

例文.2
for "_i" from 1 to 15 do {
	player sideChat format ["%1",_i];
	if (_i == 10) exitWith {player sideChat "10も数えれば十分だ"};
};
player sideChat "処理完了"; 
exitWithの条件が満たされた場合、スクリプト全体ではなくforループが終了する。

ループ処理

while

構文
while {条件} do {処理}; 
条件が満たされている限り、処理を反復実行する。

例文
while {a < b} do {a = a + 1}; 
whileの条件は高速で確認を繰り返すためPCに大きか負荷がかかる。
負荷軽減のためにもsleepを挿入することを推奨する。

より良い例文
while {a < b} do {
  a = a + 1;
  sleep 1;
}; 

for

構文.1
for "_i" from 0 to 10 do {処理}; 
任意の変数が指定した初期値から指定した最終値へ達するまで、処理を反復実行する
構文.1では変数_iが初期値0から最終値10に達するまで、処理を処理を反復実行する
stepで指定されない限り、変数は一度の処理毎に1ずつ加算する

例文.1 プレイヤーのバックパックに「6.5 mm 30Rnd Sand Mag」を3つ加える
for "_i" from 1 to 3 do {
	player addItemToBackpack "30Rnd_65x39_caseless_mag";
}; 

構文.2
for "_i" from 100 to 0 step -10 do {処理}; 
変数の初期値100から処理毎に10ずつ減算され、最終値0になるまで処理を反復実行する

例文.2 10から0までカウントダウンする
for "_i" from 10 to 0 step -1 do {
	hint str _i;
	sleep 1;
}; 

forEach

配列の要素それぞれに対してコードを実行する
配列の各項目は変数"_x"に代入される

構文
コード forEach 配列; 

例文.1
{_x setDamage 1;} forEach ["man1","man2","car1"]; 
Variable Nameが"man1"、"man2"、"car1"それぞれのユニットを殺害・破壊する

例文.2
{_x setDamage 1;} forEach units group this; 
コマンドが与えられたユニットが存在するグループを全滅させる

組み合わせ例.1
{_x disableAI "PATH"; _x setUnitPos "UP";} forEach units group this;
組み合わせ例.2
{this disableAI _x} forEach ["AUTOCOMBAT", "AUTOTARGET", "MOVE", "TARGET"];

Variable関係

setVariable

指定した名前空間もしくはオブジェクトなどに変数を与えるスクリプトコマンド。
initなどで初期化するときや、スクリプトやトリガーなどで使用し、変数を定義・更新する。

【構文】
<名前空間> setVariable ["<変数>",<>,<全体共有(true/false)>];
  • 名前空間 : 変数を適用する範囲(Namespace, object, groupなど)
  • 変数 : 設定したい変数名 (string)
  • 値 : 変数に代入する値 (Anything)
  • 共有 : JIP(途中参加プレイヤー)に変数を共有するかどうか (trueで共有化)

【使用例】
ミッションに備え付けてある名前空間に変数「task1done」を「true」という内容で設定する。
missionNamespace setVariable ["task1done",true];

特定のユニットに変数を設定する
_unit setVariable ["trueCriminal",true,true];

getVariable

指定した名前空間もしくはオブジェクトから変数を読み込むスクリプトコマンド。
トリガーの起動条件や、スクリプトの条件分岐などに使用する。

【構文】
<名前空間> getVariable ["<変数>",<デフォルト値>];
  • デフォルト値 : 変数が未定義の場合に適用される値

【使用例】
ミッションに備え付けてある名前空間から変数「task1done」を読み込み、それを返す。
task1doneという変数が定義されていない場合「false」を返す。
missionNamespace getVariable ["task1done",false];

publicVariable

変数とその値を、Server(厳密にはmissionNamespace)とClient(プレイヤーPC)に配信する。
JIPにも対応。

【構文】
publicVariable "<変数名>";

【使用例】
変数「task1done」に値「true」を代入し、配信する。
task1done = true; 
publicVariable "task1done";
この構文は以下の構文と等しい
missionNamespace setvariable ["task1done",true,true];

【注意点】
publicVariableはServerもしくは単一Clientのみで行うことが望ましい。
Globalで実行してしまうと、Serverと全てのClient上で変数配信が実行されてしまい、ネットワークに負荷を与えてしまう。
トリガーではServerのみで実行するようにすること。

setVariableとpublicVariableの使い分け

【結論】
  • 値を全体共有することが目的ならば「publicVariable」
  • 値を特定の場所で設定すれば十分であるなら「setVariable」
  • 読み取りは「getVariable」を使用することで不具合の発生を防ぐことができる。

ケース1. タスク関係
  • タスクをモジュールや Arma 3 Task Framework で作成・管理している場合
    • Serverが変数を受け取ればタスクの状況を自動で各Clientに配信してくれるので「setVariable」をServerでのみ実行すれば良い。
  • タスクを createSimpleTask で作成した場合
    • タスクの状態は各Clientがそれぞれ管理しているので「publicVariable」にて変数を配信し、各Clientがタスクの状態を更新できるようにしなければならない。

ケース2. ユニットの状態
  • 特定のユニットに任意の状態を設定したい場合「setVariable」を使用する
ユニットinit
thit setvariable ["isHacker",true,true];
Laptopオブジェクトのinit
this addAction [
  "ハッキングする",
  {
    hint "ハッキング完了!";
  },
  nil,
  1.5,
  true,
  true,
  "",
  "_this getVariable [""isHacker"",false]",
  4
];
上記の例では「thit setvariable ["isHacker",true,true];」と設定されたユニットのみがアクションメニューにアクセスすることができる。

注意点

マルチプレイでの注意点

initの読み込み

オブジェクトのinitに記述した内容は、プレイヤーがゲームに参加するたびに実行される。
たとえば、アイテムストレージのinitに
clearItemCargoGlobal _box;
と記述すると、サーバーにプレイヤーが参加するたび、コマンドが付与されたストレージのアイテムが削除される。

これを防ぐためには
if (isServer) then { clearItemCargoGlobal _box; };
のようにサーバーのみで実行するように設定すると良い。

Server上でのみで実行すれば良いグローバルコマンドなどにも同様に、
if (isServer) then { this disableAI "MOVE"; };
と記述すると無駄なコマンドの実行を排除することができる。

実行するコマンドがグローバルであるかどうかは 公式Wiki を参照すること。

コマンドの実行範囲

サーバー上でクライアントが
skiptime 6;
というコマンドを実行したとしても、それが有効となるのはクライアント上だけであり、サーバーとは同期されない。
さらに、ゲーム内時間はクラアントがサーバーと定期的に同期されてしまい、クランアント上で時間が変更されてもすぐにサーバー時間に戻されてしまう。

また、
hint "MENTAIKO";
といった文字表示コマンドは実行された端末でのみ表示されるため、全員に表示されるわけではない。

つまり、コマンドには実行される範囲のようなものが存在する。
なので、特定のクランアントが実行したことを全てのクライアントもしくはサーバー上で実行するには、ひと手間加える必要がある。

これを解決するのがremoteExecである。
6 remoteExec ["skipTime", 2];
上記のコマンドでは、クランアントがサーバーに"skipTime"のコマンドを実行するようにと伝え、サーバーが処理を実行する。

"MENTAIKO" remoteExec ["hint", [0,-2] select isDedicated, true];
このコマンドは、サーバー上で実行された場合、すべてのクライアント上で"hint"コマンドを実行する。
"[0,-2] select isDedicated"の部分は以下の分岐を行っている。
  • Dedicatedサーバー上では、全てのクライアントで実行する
  • Player Hostサーバーでは、Hostと全てのクライアント上で実行する

各コマンドの実行範囲はBohemia Community Wikiに記載されている。

ZEUS使用時の注意点

ZEUSでユニットにスクリプトコマンドを付与するときは、必ずローカル関数を使用すること。
※ローカル関数
_object など、変数に「_」を追加したもの
上記で「this」となっている部分を「_this」と変換すればOK












添付ファイル
記事メニュー
目安箱バナー