円の中からランダムな位置にキャラを配置するスクリプト
今回紹介するのはこの処理
_pos = _center getPos [_radius * sqrt random 1,random 360];
_center は円の中心になる座標
_radius は円の半径距離
を入れること
例:プレイヤーから半径200mの円からランダムな位置にユニットや車両などを湧かせる
_center = player;
_radius = 200;
_Position = _center getPos [_radius * sqrt random 1, random 360];
_Unit01 = group player createUnit ["B_Soldier_F", _Position, , 0, "CAN_COLLIDE"];
問題点:このままでは円の一部が水上にあると生成する物体が水上に出現することになる
例えばこのような場所に設定した場合、画像のように海上にユニットが出現してしまう
そこで座標 _Position が陸上にあるか判定し、座標が陸上になるまでループ処理をすることで大量に湧かせても水上に湧かないようにする
座標の陸上か判定する処理
_overLand =! (_Position isFlatEmpty [-1, -1, -1, -1, 0, false] isEqualTo );
_Position が 陸上にある場合はTrue、そうでない場合Falseを_overLandに返す
そして、つぎのようにループ処理を入れる
_center = player;
_radius = 200;
_Position = _center getPos [_radius * sqrt random 1, random 360];
_overLand = (_Position isFlatEmpty [-1, -1, -1, -1, 0, false] isEqualTo );
while {_overLand} do
{
_center = player;
_radius = 200;
_Position = _center getPos [_radius * sqrt random 1, random 360];
_overLand = (_Position isFlatEmpty [-1, -1, -1, -1, 0, false] isEqualTo );
};
_Unit01 = group player createUnit ["B_Soldier_F", _Position, , 0, "CAN_COLLIDE"];
もし、この円が全て水上にある場合、陸上の位置を探すために延々とループ処理することになるので、もう少し工夫して一定時間経過したら処理を抜け出すというものと追加する
抜け出すと座標は水上のどこかになる
_center = player;
_radius = 200;
_Position = _center getPos [_radius * sqrt random 1, random 360];
_overLand = (_Position isFlatEmpty [-1, -1, -1, -1, 0, false] isEqualTo );
_time = time +10;
while {_overLand} do
{
_center = player;
_radius = 200;
_Position = _center getPos [_radius * sqrt random 1, random 360];
_overLand = (_Position isFlatEmpty [-1, -1, -1, -1, 0, false] isEqualTo );
if(time>_time)exitWith{true};
};
_Unit01 = group player createUnit ["B_Soldier_F", _Position, , 0, "CAN_COLLIDE"];
このように記述すればとりあえず陸地に配置することができるようになる。
どうしても水上に配置したくない場合はwhile処理の後にif分岐で陸地なら作成、それ以外なら何もしないように変更すればいい