このチラ裏では、Arma3にてエディターとしても活躍したいエディター初心者向けの指南を綴っていきます。
玄人エディター向けのコマンドリファレンスはミッションエディット#Scripting Commands Referenceを参照。
頭の中で漠然としたアイデアを練るもよし、テキストファイルにつらつらと書いていくもよし。
ただし、必ずどういうミッションにしたいか、どういう目標を置きたいかを決めることが肝心です。
「破壊」「殲滅」「救出」「暗殺」などミッションの主目標を決め、そこから設定や配置、味方・敵の各陣営を決めていきましょう。
構想が決まったら、Arma3を起動しましょう。
CCG鯖のプリセットのまま起動すると、余計なAddonが干渉したりするため、必要なAddonのみをArma3 launcherで選択し、起動しましょう。
筆者がおすすめするのは、CBA、ACE3、3CB、CUP、RHS、TFAR等の主要addonのみでの起動です。
起動したら、画面中央の3つのアイコンからEDITORを開き、使いたいmapを選んでエディターを開きましょう。
スタート地点はmapのどこでも大丈夫ですが、空港や前哨基地などの軍事施設からスタートするのが基本的な配置でしょう。
そのほかにも、適当な道路沿いに兵士と車両を配置しても構いません。
ミッションにストーリー性を持たせる意味でも、軍事施設にこだわらず平原や森の中など色んな可能性を考えてみましょう。
上記で書いたミッションの主目標の中で、「暗殺」「破壊」など『1つのオブジェクティブを排除する』といった目標が一番簡単です。
エディターの操作やトリガーの配置に慣れるためにも、最初は簡単なものからスタートしてみるのがコツです。
それでは実際に目標となるオブジェクト(やユニット)、そしてミッションの勝利条件を設定するためのTriggerを置いて行きましょう。
例: 敵将校の暗殺ミッション
・敵将校のユニットを置く(OPFOR陣営のColonelやOfficer、Warlordなど)
・敵将校ユニットのAttributesを開き、Variable nameに名前を付ける(「TARGET」など)
・効果範囲の無いTriggerを設置し、TriggerのAttributesを開く
・TriggerのType欄で「Anybody」、Activation欄で「Present」をそれぞれ選択する
・TriggerのCondition欄に!alive TARGET;
と記述する
・TriggerのOn Act欄に["end1",true,true] call BIS_fnc_endMission;
と記述する
・TriggerのAttributesを閉じる
上記の操作によって、インゲームで敵将校を倒したらMISSION ACCOMPLISHEDと書かれた画面が出てくるようになります。
エディター画面右下のPLAY SCENARIOをクリックし実際に作動するかどうか確かめてみましょう。
主目標の設置が終わり、動作することを確認をしたら次は敵兵士を設置です。
敵将校と同じ軍隊の兵士を置くのが好ましいでしょう。
建物の内外、道路上、ビルの上などに設置し、より雰囲気のあるゲームプレイに仕上げましょう。
設置型機関銃やテクニカル・武装車両などを置くと更にゲームプレイに刺激を与えられます。
ただし、1つの陣営につき144人の兵士しか設置できません。
それに、そもそも144人も設置するとミッションが重くなりプレイできなくなってしまいます。最大数は50~70人ほどが目安です。
うまく配置して、敵の数は少なくても、プレイヤーの難易度が適切になるよう配置を工夫してみましょう。
陣営(SIDE)とは
の4つがあります。
基本的に
ゲームエディター内の操作説明はここで終わりです。
続いてはミッションをきちんと動作させるため、そしてミッションにストーリー性と雰囲気を持たせるための作業に入ります。
具体的な作業としては、
の3つです。
保存したミッションファイルは、マイドキュメント\Arma 3\mpmission\内に保存されます。
例:Altis島マップで「Neochori」という名前のミッションを保存した場合\mpmissions\Neochori.Altis\
がミッションが保存されているフォルダです。
taskの生成
if (!isDedicated) then {waitUntil {!isNull player && isPlayer player};};
task1 = player createSimpleTask ["Kill the officer"];
task1 setSimpleTaskDescription ["敵将校を暗殺せよ", "Kill the officer", Kill the officer"];
player setCurrentTask task1;
上記『目標を設置する』で説明した例に沿って書いています。この合計4行のコマンドラインを上から順番に説明していきます。
ミッションが回るまでinit内スクリプトを開始させない
if (!isDedicated) then {waitUntil {!isNull player && isPlayer player};};
必ず入れないといけません。この1行だけは、必ずinit.sqfの一行目に書いてください。
このコマンドラインは、「Dedicatedサーバーなら、プレイヤーが入ってくるまで以降のコマンドを実行するのを待つ」といったことが書かれているようです。
init.sqfの一番最初に入れなければなりません。
taskの生成
task1 = player createSimpleTask ["Kill the officer"];
この2行目で、taskを作ります。taskは、プレイヤーに表示される”指示”のようなもので、CoDに出てくる「対空砲を破壊せよ」や
「ヘリに乗れ」といったオブジェクティブの働きをしています。
このtaskを作ると、プレイヤーがマップを開いたときに左上に表示され、プレイヤーの目標は何なのかを知らせることができます。
「task1という名前で、『Kill the officer』というタイトルがついたtaskを生成します」と書かれています。
taskの説明文の生成
task1 setSimpleTaskDescription ["敵将校を暗殺せよ", "Kill the officer", Kill the officer"];
上記『taskの生成』で生成したtaskの説明文を指定します。
書き方は、task1 setSimpleTaskDescription [“説明文”,”タイトル”,”Waypointでの説明文”];
となります。
説明文は・・・筆者も正直使い方をよくわかってないので、タイトルと同じ文を入れています。
taskを「現在のtask」に指定する
player setCurrentTask task1;
上記『taskの説明文の生成』で生成したtaskを、プレイヤーの「現在のtask」に指定します。
「現在のtask」に指定されたtaskは、インゲーム画面にてオレンジ色で強調され、プレイヤーがいま遂行しなければならないtaskが
どれなのかを知らせることができます。
「プレイヤーに対して、task1を「現在のtask」に指定します」と書かれています。
briefing.sqfを書く
上記『init.sqfを書く/taskを生成する』でもチラッと言及しましたが、ここではbriefingの書き方について触れます。
briefingはミッションにおける作戦内容、作戦が実行される背景、舞台設定などをプレイヤーに知ってもらうためのもので
ミッションの説明書きとしての働きをします。
こちらも、上記『目標を設置する』で出した例に沿って設定を作ってみます。
- ミッションは、Altis島現地軍であるAAFの将校の殺害
- AAFの将校はAltis島の主要都市Kavalaに潜伏している
- 主な潜伏先はKavala最西端の城内部、もしくはKavala中心に位置する病院
- 味方はNATO軍1分隊、敵の総数は不明、テクニカルやAPCを所有している可能性あり
- 市民がいた場合、これに対する射撃および射殺を許可しない
かなり即興ででっち上げた設定ですが、こういったミッションの背景があるだけでも雰囲気が増します。 次は実際に、上記に沿ってbriefingを書いてみましょう。
briefingのコマンドを書く
(工事中)
alive
例 | alive Officer1; |
---|---|
意味 | 変数名Officer1が生きているなら |
値 | Officer1が生きていればtrue、死んでいればfalseが返される。 |
and
例 | alive (Officer1 && Officer2); |
---|---|
意味 | 変数名Officer1とOfficer2が共に生きているなら |
値 | Officer1、Officer2共に生きていればtrue、 どちらか一方、もしくは両方が死んでいればfalseが返される。 |
canMove
例 | canMove tank1; |
---|---|
意味 | 変数名tank1が動ける状態ならば |
値 | tank1が動ける状態ならばtrue、動けない状態ならばfalseが返される。 |
in
例 | soldier1 in tank1; |
---|---|
意味 | 変数名soldier1が変数名tank1に乗っているならば |
値 | soldier1がtank1に乗っていればtrue、乗っていなければfalseが返される。 |
not
例 | !alive Officer1; |
---|---|
意味 | unitやvehicleなどの状態を確認する構文に付け足すことで、否定文にする |
値 | Officer1が生きてなければ(=死んでいれば)true、 生きていればfalseが返される。 |
or
例 | (soldier1 || soldier2) in tank1 |
---|---|
意味 | 変数名soldier1もしくは変数名soldier2のどちらか一方が変数名tank1に乗っているならば |
値 | soldier1もしくはsoldier2の一方または両方が tank1に乗っていればtrue、両方とも乗っていなければfalseが返される。 |
this
例1 | this addAction [Say Hello world, {hint, 'Hello, world'};]; |
---|---|
意味1 | 変数名(soldier1など)の代わりに、そのunitや vehicleそのものを表す ※unitのinit欄に書く時 |
値1 | そのunitやvehicleそのもの |
例2 | this; |
意味2 | そのtriggerの条件(EastやWest、PresentやNot present等)を 満たすなら ※triggerのCondition欄に書く時 |
値2 | そのtriggerの条件が満たされていればtriggerが達成(activate)される、 満たされていなければ達成されない。 |
thisList
例 | Officer1 in thisList; |
---|---|
意味 | 変数名Officer1が当該triggerの範囲内に入っていれば |
値 | Officer1が当該triggerの範囲内に入っていればtriggerが達成(activate)される、 入っていなければ達成されない。 |
triggerActivated
例 | triggerActivated trigger1; |
---|---|
意味 | triggerが達成(activate)されたかどうかを確認し、値を返す |
値 | 変数名trigger1が達成されていればtrue、達成されていなければfalseを返す。 |
captive
createMarker
createTrigger
disableNVGEquipment
disableTIEquipment
doSuppressiveFire
doTarget
doWatch
enableSimulation
getMarkerPos
getPos
hint
playMusic
publicVariable
setDamage
setMarkerPos
setPos
SetUnitPos
addAction
attachTo
disableAI
doStop
say
say2d
say3d
工事中
工事中