いつもお世話になっております。
今回はAHUDを使った際のCanvasクラスの挙動について質問をさせて下さい。
AHUDクラスをデバッグ用に情報表示に使っております。シングルプレイ時は特に問題ないのですが、エディタでのマルチプレイ(ネットモード:Play As Listen Server、プレイヤー数:2)でこのHUDを表示した場合、サーバー側(エディタ側)で起動したデバッグ用HUDですが、クライアントの画面でも表示されてしまいます。
試しにネットワークロールを表示するとサーバー側の情報がクライアント側の画面に表示されてしまいます。
[Image Removed]
(クライアント側でデバッグHUDを起動するとクライアント側の情報がサーバー側の画面に表示されます)
少し調べてみたところ、UDebugDrawService::Draw() から呼ばれる UCanvasがエディタでのマルチプレイ時で共通になってしまっているのではないかと思われるのですが、これを回避する方法は何かありませんでしょうか?
よろしくお願いいたします。
[Attachment Removed]
再現手順
1、プレイヤー数2、PlayAsListenServer で起動する。
2、サーバー側(エディタ側)でコンソールコマンド[Debug.ToggleHUD]を入力しデバッグ用HUDを起動('0’キーを入力しても同様)
3、サーバー側(エディタ側)で起動したHUDがクライアント側でも表示されます。
4、逆にクライアント側でデバッグHUDを起動した場合、サーバー側(エディタ側)での画面でも表示されます。
[Attachment Removed]
t-nikaido1
(t-nikaido1)
January 20, 2026, 7:21am
3
お世話になっております。
デフォルトでは PIE において全てのプレイヤーで同一のプロセスを共有する設定になっていますが、これを変更するのが最も簡単かと思います。
エディタ設定内で “Run Under One Process” をオフにしてお試し下さい。
[Image Removed]また、デバッグ表示用コールバック内で識別を行うことも考えられます。
添付して頂いたコードにおいては ADebugHUD::DrawDebugHUD 関数冒頭あたりで
if (IsValid(Cont))
{
if (Cont->GetWorld() != GetWorld())
{
return;
}
}
のようにして別のクライアントのための通知では描画を行わないようにできそうです。
よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
さらに調べたところ、描画部分のメソッド
>void ADebugHUD::DrawDebugHUD(UCanvas* InCanvas, APlayerController* Cont)
の引き数 APlayerController で、UE5.6まではnullが入っているのですが、UE5.7からはコントローラーのポインタがちゃんと入っていました。
サンプルプロジェクトは5.7でしたのでワールドの比較で正しく動作し、元プロジェクトはまだ5.6でしたのでうまく動作しないということでした。
ちなみに、UE5.6のほうはアクター生成時にビューポートを保持してワールドを判別するようにして回避できました。
また何かありましたら質問させていただきます。
よろしくお願いいたします。
[Attachment Removed]
ご回答ありがとうございます。
[Run Under One Process]で行ったところ表示はちゃんとHUDデバッグを使った画面だけ表示されました。
ただこの方法ですとPCスペックと処理負荷の関係かアクティブではない方の画面描画が遅すぎるのと、
ゲームパッドの対応をしないと1つのコントローラーで両方とも動いてしまいますね。
Worldの比較をするほうはサンプルプロジェクトでは確かにうまくいくのですが、
元のプロジェクトで試すとなぜかうまくいかなかったです。(サーバー/クライアント画面両方にでる)
細かい違いはあれど、コンソールコマンドからAHUDを生成して表示する部分は同じなので原因がよくわかりません、もう少し調べてみようと思います。
[Attachment Removed]