【game】Arma3スクリプト未整理の書
しょうが無いね。
EXILE MODサーバ用で調べてるだけですので、他用途では参考程度に。質問はコメントに(気分屋なので返信する保証は無いけどねッ)
文法メモ(独特ですがJavaScript風?)
private _val; 変数定義は不要。局所用はスコープ忘れず
_val = [“000″,"111″,"222"]; よく利用する配列(文字・数値・オブジェクトなんでも入ります)何重入れ子もOK
if(true) then{}else{}; 例外無く最後は”;”で締める。if文は忘れっぽい
swicth(_ass)do{ case “hole”: { };} でもswitchの最後は要らない
{ }forEach(_objs); forEachは良く使う(中身は"_x"に入る)
_trg setTriggerStatements [“true","",""]; オブジェクト(_trg)への操作はこんな感じで書きます。先頭にオブジェクト
コメント
他の主要な言語系(CやJava等)と同じ。//、/* */
コマンドリファレンス(複雑怪奇)
https://community.bistudio.com/wiki/Category:Scripting_Commands_Arma_3
https://community.bistudio.com/wiki/Category:Arma_3:_Functions
古いモノも含まれてるので注意です(BIS_から始まるもの:関数)コマンド名は動詞が先にくるものが多い。isServerとかCreateVehiceとか。
ファイルパスのデミリタ
”/”でも”¥”でも良いようだが、公式では”¥”で書かれてるようなので、統一しておいた方が良いようです。つまりはWindows向けっぽく。これでもLinuxで動作します。
スクリプトの初期化実行順序(但し、処理待ちせず並列で動作するので注意)
https://community.bistudio.com/wiki/Initialization_Order
スクリプト並列処理の諸注意
多くのタスクが並列で動作するため、タイミングによっては動作しなくなる場面があります。切り分けが難しく、現在でもsleep()などでタイミングを取ってるスクリプトが多くあります。
デバッグログRPT出力(公式)
diag_log format [“%1, %2", player, time];
_arr = [1, “foo", player, “bar"]; diag_log _arr; 配列変数を渡しても展開して出力
時間を取得する
waitUntil {time > 0}; ミッションが始まるまで待機。timeはミッションスタートからの秒数
serverTime サーバとクライアントで同期されてるミッション開始からの秒数。但し、開始時5分間はその保証が無い。
diag_tickTime 1/1000秒
_now = date; 戻り値は[year, month, day, hour, minute]
フレームレートを取得する
diag_fps 平均フレームレート
diag_fpsMin 最小フレームレート
Description.extの書き方(各種定義・サウンド等)決まり事が沢山あるので要注意
https://resources.bisimulations.com/wiki/Description.ext
ファイルを探す場所(外部スクリプトやメディアファイルなど)
https://community.bistudio.com/wiki/Script_Path
サウンド
Description.extで定義して、その名前(クラス名)を指定して鳴らす。又は、Arma3本体内蔵サウンド。ファイル形式は、ogg(オープンソース)かwss(ボヘミア独自)ミッションファイルがデカくなるので多用は難しい。
通常再生の他、3D効果(SFX/SGX)、バックグラウンド(Music)などがある。
SFXサウンド(未検証)
トリガーを絡めないと再生できない。基本的にはリピート再生。止める場合はトリガー削除でOK。エラーが頻発バグがあるため、$NONE$で回避する必要アリ(サウンド設定の類はDescription.extで細かく指定)
private “_trigger"; _trigger = createTrigger [“EmptyDetector", position player]; _trigger setTriggerStatements [“true", “", “"]; _trigger setSoundEffect [“$NONE$", “", “", “サウンドを指定"];
Arma3本体内蔵の効果音(これだけじゃないはず)
https://community.bistudio.com/wiki/Arma_3:_SoundFiles
検索用:playsound3d、say3D
オブジェクトから音をループで再生(もっとスマートな方法がありそう)
https://steamcommunity.com/sharedfiles/filedetails/?id=772764361
文字列の結合
“ass”+”hole” まぁ・・今風スクリプト言語っぽい
ランダムでオブジェクトを選ぶ(戻り値は要素)
selectRandom [“あ","ほ","の坂田"] 便利です
BIS_fnc_selectRandomというモノもあるが、推奨されてない。こちらはArray(要素1)で戻る
オブジェクトの生成
createVehicleで生成する。車両やAIでも、あらゆる物体は何でもコレです。違和感感じますがしょうが無いね(静的オブジェクトだけは別)Arma3固有の機能が有る状態で生成されます(武器クレイトとか)
静的オブジェクトは別で生成
シンプルオブジェクトは、MAPと同じ様に振る舞うモノで、処理速度が速い。createSimpleObjectで生成。あの忌まわしい物理演算が働きません(重要)。hideSelectionで対象選択も出来なく出来る。
物理演算について
Arma3はNVidiaのPhysXのみ対応なので、IntelビデオやAMD Radeonでは恩恵を得られません。残念ッ!!ちなみに、GeForceとRadeon2枚刺しすると、PhysXが無効になるよ。NVidiaが意地悪をしてる性だよ。ヒドイね
座標系について(要は海面基準かどうか)
https://community.bistudio.com/wiki/Position
MAPの左下が、[0,0]になってる。ゲーム中のGPSで表示されるのは、10m単位(桁に注意)
MAPのサイズを知る
_size = worldSize; //8192 (単位はメートル)
MAPの名前を知る
_name = worldName;
ロケーション関連(種類)
nearestLocations [player, allLocationTypes, 500]; 近場のロケーションを得る(リスト)
createLocation [className, position, sizeX, sizeY] ロケーションの作成
MAP上のランドマークリストを得る(市町村の場所)
_locations = (nearestLocations [_spawnCenter, [“NameVillage","NameCity", “NameCityCapital"], _maxDistance]); ロケーションタイプの指定で対象を変更
ある場所から平坦っぽい場所を得る(公式)
イベント発生地や安全に車両を沸かせたい場合に便利
findSafePosを利用する方法
_tempPosition = [_pos,0,_maxDist,15,_inWater,20,0] call BIS_fnc_findSafePos;
isFlatEmptyを利用する方法
position isFlatEmpty [minDistance, mode, maxGradient, maxGradientRadius, overLandOrWater, shoreLine, ignoreObject]
ある場所から最も近い建物を調べる(リスト)
_buildings = _selectedPlayer nearObjects [“building", 20];
ある場所から最も近い道路を調べる(リスト)
_nearRoads = _position nearRoads 500;
ある場所から最も近いオブジェクトを調べる(リスト)
nearestObjects [_position,[“Land_UWreck_MV22_F"],750])
_list = player nearEntities [[“Car", “Motorcycle", “Tank"], 50];
オブジェクト間の距離を測る(distance/distance2D)
2次元平面での直線距離か、高度も入れた最短距離かで選びます。
_meters = position player distance nearestLocation [position player, “hill"];
ある場所が水・海の中かを調べる(bool)
_isOverWater = surfaceIsWater _position;
マップマーカー関連(マーカー)
_marker = createMarker [format [“%1", _locationName],_spawnPosition];
_marker setMarkerShape “Icon";
_marker setMarkerSize [3,3];
_marker setMarkerType “mil_dot"; マーカー種類
_marker setMarkerBrush “Solid";
_marker setMarkerText _markerName;
_marker setMarkerColor _markerColour;
_marker setMarkerAlpha 0.5;
トリガーの動作
Arma3を英語モードにして、条件の可否を確認すると分かり易いです。
英語モードにすると、引数やらが公式リファレンスと同じ表記になるため。
トリガーの作成(詳しくはリファレンス)
デフォルト値を保有してるので全て指定する必要無し。
private _trg = createTrigger [“EmptyDetector", _pos,true];
_trg setSoundEffect [“$NONE$","","",””]; エフェクト類
_trg setTriggerActivation [“NONE","PRESENT",true]; 対象
_trg setTriggerStatements [“true","",""]; 条件式や動作スクリプト
設定ファイル(config)から読み出す(Arma2時代とは違う所)
_header = getMissionConfig “Header"
_respawnDelay = getMissionConfigValue [“respawnDelay",0]