FusionInterestArea
広大なワールドでは、すべてのオブジェクトの状態をすべてのクライアントに送信すると、帯域を浪費するだけでなく、プレイヤーが知るべきでない情報が漏れることもあります。この問題は関心領域(Area of Interest:AOI)によって、各クライアントが特定の空間領域を購読できるようにして、領域内のオブジェクトのみを複製することで解決できます。購読していない領域のオブジェクトはクライアントから見えなくなるため、帯域とチートの余地を同時に減らすことができます。
Fusionはグリッドシステムで関心領域を実装しています。ワールドは固定サイズのセルで分割され、各クライアントは自身の位置周辺のセルを購読します。オブジェクトは自身が属するセルを公開し、サーバーはオブジェクトのセルとプレイヤーの購読情報を照合して、送信するオブジェクトを決定します。
概要
FusionInterestAreaは、関心領域のグリッド購読を自動管理します。これを子ノードとして追加すると、形状・サイズ・対象ノードの位置に基づいて、各フレームでどのグリッドセルを購読するかを計算します。
interest_modeの概要については、レプリケーション - インタレストマネジメントをご覧ください。
プロパティ
これらのプロパティは、購読領域の形状・サイズ・動作を制御します。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
shape |
Shape | SQUARE |
購読領域の形状 |
orientation |
Orientation | 3D_XZ |
セル計算時に投影する平面 |
grid_size |
int | 5 |
セルの辺長(Squareのみ、奇数値:1~21) |
radius |
float | 5.0 |
セルの半径(CircleとConeのみ) |
fov_angle |
float | 90.0 |
視野角度(Coneのみ) |
base_send_rate |
int | 1 |
中央セルの送信レートの上書き(0 = サーバーのデフォルトを使用) |
decay_mode |
DecayMode | DOUBLING |
中央からの距離によって送信レートをどう増加させるか |
target_path |
NodePath | ".." |
位置に基づくセル計算を行うノード |
enabled |
bool | true |
実行時に購読のON/OFFを切り替える |
デバッグ用プロパティ
デバッグの可視化を有効にすると、購読されたセルがビューポート上にオーバーレイで表示されます。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
debug_draw |
bool | false |
購読されたセルをオーバーレイで描画するか |
debug_labels |
DebugLabels | NONE |
デバッグセル上に表示されるラベル内容 |
debug_gradient |
Gradient | null |
送信レートに対応したカラーグラデーション(低 → 高) |
列挙型
Shape
購読領域の形状によって、対象位置周辺のセルをどのように選択するかが決定されます。
| 値 | 説明 |
|---|---|
SQUARE |
grid_size × grid_size 長方形領域 |
CIRCLE |
半径に基づいて、円の外側の角にあるセルをスキップする |
CONE |
視線方向への指向性を持つ視野 |
Orientation
グリッドが投影される2D平面を選択します。
| 値 | 説明 |
|---|---|
2D |
XY平面(Node2Dシーン用) |
3D_XZ |
XZ平面(3Dのデフォルト) |
3D_XY |
XY平面(3D用) |
DecayMode
中央から離れたセルに対して、サーバーの送信レートをどのように低下させるかを制御し、端領域の帯域を節約します。
| 値 | 説明 |
|---|---|
FLAT |
すべてのセルで同じ送信レート |
DOUBLING |
ring 1を超えるごとに倍増 |
LINEAR |
base + ring × step |
DebugLabels
デバッグラベルでは、デバッグオーバーレイの各セルに表示される情報を設定できます。
| 値 | 説明 |
|---|---|
NONE |
ラベルなし |
PRIORITY |
計算された優先度の値を表示 |
CELL_AND_PRIORITY |
セルのIDと優先度を表示 |
使用例
FusionReplicatorの兄弟ノードとしてFusionInterestAreaを追加し、インスペクター上またはコード上から、形状と半径を設定します。
GDScript
# Scene tree:
# Player (CharacterBody3D)
# +-- Camera3D
# +-- FusionReplicator
# +-- FusionInterestArea
@onready var interest: FusionInterestArea = $FusionInterestArea
func _ready():
interest.shape = FusionInterestArea.SHAPE_CIRCLE
interest.radius = 8.0
interest.decay_mode = FusionInterestArea.DECAY_DOUBLING
グリッド計算に使用されるセルサイズは、プロジェクト設定のfusion/interest_management/area_of_interest_cell_sizeからグローバルを設定されます。INTEREST_AREAモードに設定されたすべてのFusionInterestAreaとFusionreplicatorは、このセルサイズを共有します。