ランタイム時にポーンを配置する主な目的の 1 つは、プレイスルーごとにゲームプレイに違いを与えることです。
ポーンがエディタ内に配置され、プレイスルーごとに移動されなかった場合、1 ラウンドをプレイすると、それらのポーンが毎回どこに配置されているかが正確にわかります。 毎回ランダムにポーンを配置する場合は、複数の開始時のコンフィギュレーションを使用できます。
これを大まかに言うと、5 x 5 のタイルと 5 つのポーンからなるボードがある場合、(25C5) の 53,130 の異なるコンフィギュレーションがあります。 ボードの各次元の空間数を 6 x 6 に 1 増やして、ポーンを 5 つ保持する場合、その数は (36C5) の 11,686,752 に達します。
ランダム化は、変化に富んだゲームプレイを作成するための強力なツールとなる可能性があります。
ランダムなタイル座標を生成
ポーンをランダムに配置するには、ボードのバウンド内にランダムなタイル座標を生成する必要があります。 2 次元空間で座標をランダムに生成するには、さまざまな方法があります。 最も一般的なのは一様分布であり、この例で使用します。 一様分布では、ポーンがボード上の任意のタイルに配置される可能性が等しくなります。 詳細は、https://en.wikipedia.org/wiki/Discrete_uniform_distribution をご覧ください。 このためには、境界オブジェクトを取り込んで、どのドメイン内に座標を生成するかを認識する、GenerateUniformRandomTileCoordinate という名前のユーティリティ関数を作成します。
2 次元空間で均一に分散したタイル座標を生成するために、各次元で整数を個別にランダムに生成し、タイル座標オブジェクトでそれらを組み合わせます。
using { /Verse.org/Simulation }
using { /Verse.org/Random }
UtilityFunctions<public> := module:
...
GenerateUniformRandomTileCoordinate<public>(BoardBounds:board_bounds)<transacts>:tile_coordinate =
tile_coordinate:
Left := GetRandomInt(BoardBounds.LeftBounds.Low, BoardBounds.LeftBounds.High)
この関数は、次のステップを実行します。
ボードの左バウンド内でランダムな整数を生成します。
ボードの前方バウンド内にランダムな整数を生成します。
これらを組み合わせてタイル座標オブジェクトにします。
有限のサポートを持つより個別の配布のリストについては、次の表を参照してください https://en.wikipedia.org/wiki/List_of_probability_distributions。 これらの分布のいくつかに関する座標を生成し、ポーンの配置がどのように変化するかを確認する独自の関数を作成することができます。
十分な空き空間の確保
ボードにポーンを配置する前にさらに考慮する必要があるのは、ポーンの数に対して十分なボード 空間を利用できるかどうかを判断することです。 そうするには、ボード境界オブジェクトを受け取り、ボード上のタイル数を出力する、NumberOfTileCoordinates という名前のユーティリティ関数を作成します。
using { /Verse.org/Simulation }
using { /Verse.org/Random }
UtilityFunctions<public> := module:
...
NumberOfTileCoordinates<public>(BoardBounds:board_bounds)<transacts>:int =
(BoardBounds.LeftBounds.High - BoardBounds.LeftBounds.Low) * (BoardBounds.ForwardBounds.High - BoardBounds.ForwardBounds.Low)ポーンのランダムな配置
ボードにポーンをランダムに配置するには、生成するポーンの数が必要です。 これをボード クラスで編集可能な変数として追加します
ボード上のポーン数を決定したら、ポーン配置の手順は次のとおりです。
NumberOfTileCoordinatesがあるポーンの数に対して十分なタイル座標が利用できることを確認します。GenerateUniformRandomTileCoordinateによってタイル座標をランダムに生成します。その座標にポーンがすでに存在するかどうかを決定します。
有効な場合はステップ 1 に戻ります。
[No] の場合は ステップ 4 に移動します
生成された座標での
SetPawnが成功するかどうかを決定します。動いている場合は、次のポーンに移動します
そうでない場合はエラーを生成します。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
この関数は、以下の場合にのみ成功します。
所定の数のポーンに対して十分なボード空間がある。
各ポーンは、そこにまだポーンがない座標に正常に配置されます。
ランタイム時のボード生
ランタイム時にボードを生成するには、ボードの OnBegin 関数をオーバーライドして PlacePawns を呼び出すだけです。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
概要
要約すると、このページでは、次の手順を説明しました。
ボードに全てのポーンをランダムに配置します。
ファイル
using { /Verse.org/Simulation }
using { /Verse.org/Random }
DataTypes<public> := module:
tile_coordinate<public> := class<concrete>:
@editable
Left<public>:int = 0
@editable
Forward<public>:int = 0
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):