【game】Arma3スクリプト未整理の書

2017年7月24日プライベートarma3,code,program,script,server,sqf

sc20170724192804その都度調べるのに疲れてしまたので、乱暴にメモしていきます。検証してないので嘘も混じってます。まったくの未整理です。その都度、修正・追記していきます(多分、相当長くなる)

しょうが無いね。

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;

トリガーの動作

20170724221714_1イベント条件判断には、トリガーを利用する事になりますが、イマイチ良く分からない場合。

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]

2017年7月24日プライベートarma3,code,program,script,server,sqf

Posted by nabe