【UE5】サーバーコード・ディレクティブ

この記事は約4分で読めます。

以前は、【UE5】DEBUG用のプリプロセッサディレクティブ【C++】について書いたが、今回はサーバーの時はコンパイルしない、というのが必要になった。久々にサーバーでちゃんと動くのかな?と気になって、考えてみたらビルドできるわけがないな、となった。案の定、エラーが出た。

サーバーかどうか判定するためのディレクティブは次に書いてあった。

What's the difference between UE_SERVER and WITH_SERVER_CODE
Are you sure about that? I’ve been always thinking that it’s the opposite. UE_SERVER checks if it’s a Server build. And ...

最近の記事でこんなのもあった。

紛らわしい!何が違うの?Unreal Engine のあれこれ | ドクセル
ドクセルはスライドやPDFをかんたんに共有できるサイトです

なかなか詳しく書いてある。

俺はClientとServerは分かったんだが、Gameってのが意味不明だった。クックやClientビルドをしないで動かす場合にUnreal Editor経由でクライアントを動かそうとする時は -Game を指定しなきゃならない。次の記事に書いた。

【UE5】コマンドライン引数
「専用サーバーをクックしないで動かす」のことも、公式サイトのドキュメントに書いてあった。当然かもだけど。クックもパッケージ化もする必要がないし、Unreal Editor経由で動かせばDevelopment ClientやDevelopme...

-Gameの代わりに-Clientにしても動かないはず。Unreal Editor経由だから仕方がないのかもしれないけど。

まあとにかく、らりほま氏の話にあるようにディレクティブとしては次のように分けられている。
■Game:スタンドアロン
UE_SERVER=0, WITH_SERVER_CODE=1
■Client:クライアント
UE_SERVER=0, WITH_SERVER_CODE=0
■Server:サーバー
UE_SERVER=1, WITH_SERVER_CODE=1

ちとややこしいが、サーバーでコンパイルしたくなければ、
#if UE_SERVER==0
#endif
としておけばOK。

で、ビルドしてクックしてパッケージ化してみたんだが、見事に動かなかった。

UE5プロジェクトをLinux向けにPackageする方法

どうやら予めVS2022でプラットフォームlinuxでビルドしておかなきゃダメらしい。そりゃそうなのか?Unreal EditorでもコンパイルっぽいことをしていたからVS2022でやる必要はないのかと思ったんだが。
しかも、EditorとServerでそれぞれやらなきゃならないらしいので、UE_SERVERじゃダメってことになった。linux用のディレクティブが必要。ググってみたら次のサイトがあった。

UE4/C++: ジェネリック・プラットフォーム・罠ビリティー - C++ ときどき ごはん、わりとてぃーぶれいく☆
諸事情により UE4 でゲームではない何かを開発したりユカイなマルチプロセスのゲームを作ったりすると プロセスID を取得したくなるかもしれない。わたしはなった。 UE4 にはそんな時に便利そうな FGenericPlatform::Get...

PLATFORM_LINUXを使えばいいらしい。

linuxでコンパイルしたくなければ、
#ifndef PLATFORM_LINUX
#endif
としておけば今度こそ動くはず。
↑違ったっぽい。再調査中。

UE5だと出てこないから、C++の方で調べたら、linux用は __linux があると言う話だった。しかしやってみたら上手く行かない。WIN64は _WIN64 がると言う話だからやってみたら、こっちは上手く行った。

linuxでコンパイルしたくなければ、
#ifdef _WIN64
#endif
としておけばOK。

で、コンパイルしてクックしてみたんだが、サーバーのシッピングというのはできないのかな?シッピングの意味は出荷らしいけど、サーバー出荷なんてしないからってことなのか。今年話題になったポケモンみたいなゲームはサーバーもプレーヤーに提供しているような話があったりしたが、あれはまた違うものなんだろか。

とりあえずクライアントはシッピングできて、サーバーは開発版でパッケージングできて、ちゃんとlinuxで動いた。良かった。

クライアントは普段よりもサクサク動いている感じがした。この前、マウスの画像をウィジェットで描いてBPでマウスカーソルにする、というのをやってみたが、なんかちょっともっさりしていてダメだなってことにしていたんだが、Unreal Editor上、またはUnreal Editor経由で動かさないで、ちゃんとしたクライアントにすれば、もっさり感がなくなるのかも?優先順位は低いけど、いつか試してみる。

コメント

タイトルとURLをコピーしました