初めに
Unreal Engineのマルチプレイヤー開発において、全員に同じ処理を同期させるためにマルチキャスト(Multicast)イベントは頻繁に使用されます。しかし、「Reliable(高信頼性) や Always Relevant(常にレプリケート対象) を有効にしているにもかかわらず、一部のクライアントでマルチキャストイベントが実行されない」という奇妙な現象に遭遇することがあります。
今回は、この現象が発生する原因と、その対策方法について解説します。
環境情報
Windows 11
UE 5.6.1
発生する現象
通常、マルチキャストはサーバーからすべての接続済みクライアントへイベントを送信します。しかし、以下のような特定の条件下で一部のクライアントへの送信がスキップされてしまう場合があります。
短期間で複数回、一定の間隔をあけて実行される場合
例えば、For文などで一瞬のうちに連続実行する場合は発生しにくいですが、Queue(キュー)方式などを用いて、一定の間隔をあけながら短期間に複数回マルチキャストを実行すると発生しやすくなります。
Reliable をつけているのだから絶対に届くはず、と思いがちですが、特定のクライアントだけイベントが無視されてしまう現象が発生します。
原因:サイレント休止状態への移行
この現象の原因は、Unreal Engineのネットワーク最適化機能である 「休止状態(Net Dormancy)」 にあります。
マルチキャストイベントを連続で送信している間、サーバー側でそのアクターの「変数の変更(プロパティレプリケーション)」が一切行われない状態が続くと、サーバーは「このアクターは動きがないため、クライアント側でこれ以上更新する必要がない」と判断します。
その結果、サーバーは対象のクライアントに対して、アクターを休止状態(Dormant)へと移行させてしまいます。
この、プロパティの変更がないために自動的かつ静かに休止状態へ入ってしまう挙動は、いわば「サイレント休止状態移行」とも呼べる挙動です。
アクターが休止状態に入ると、たとえ Reliable や Always Relevant が有効なマルチキャストであっても、サーバーはそのクライアントに対してイベントの送信をスキップ(抑止)してしまいます。これが、一部のクライアントだけでイベントが実行されなくなる原因です。
対策方法
この問題を解決するには、該当するアクターの Net Dormancy(ネットワーク休止状態) の設定を変更し、自動的に休止状態に入らないように設定します。
設定手順
①該当するアクター(Blueprint)を開きます。
②Details(詳細) パネルの Replication セクションを確認します。
③Net Dormancy の項目を、デフォルトのAwakeから Never Dormant に変更します。
通常、アクターは Awake(必要に応じて休止状態へ移行可能)に設定されていますが、これを Never にすることで、サーバーは「このアクターを絶対に休止状態にしない」と判断するようになります。
これにより、変数の変更がない期間にマルチキャストを一定間隔で叩き続けても、クライアントへのイベント送信がスキップされるのを防ぐことができます。
注意事項
今回紹介した Net Dormancy = Never への変更は強力な対策ですが、設定する際は以下の点に注意してください。
通信負荷(パフォーマンス)への影響
Never Dormant に設定されたアクターは、常にネットワークの更新チェック対象となります。マップ上にこの設定のアクターが大量に存在する場合、サーバーのネットワーク処理負荷(CPU)や、全体の通信帯域を圧迫する原因になります。
そのため、ゲーム中に大量にスポーンするアクターではなく、ゲーム状態を管理するマネージャークラスなど、特定の重要なアクターに限定して適用することを推奨します。
