執筆バージョン: Unreal Engine 5.2
|
■はじめに
こんにちは、エンジニアの山中です。
今回はネットワークコンテンツにおける情報の伝達について
具体例を用いてご紹介します。
■実践
2人プレイのネットワークゲームを制作すると仮定して
接触した際にランダムな色に変化する箱を作ってみましょう。
〇下準備(エディター設定)
下記の画像の設定をそれぞれ変更しましょう。

これでDedicatedサーバ + クライアント2人の環境が
エディターで確認可能になります。
〇色が変化する箱の作成
Actorを作成して、見た目となるMeshを追加します。

処理はとりあえず下記のように組んでみました。
キャラクターが接触した際に、先程追加したMeshのマテリアルをランダムな色に変化させる処理です。

この状態で一度起動し、キャラクターを接触させてみましょう。
■発生する問題
クライアント環境それぞれで異なる色に変化してしまいます。

これは現段階でネットワークを考慮した実装になっていない為です。
今回はこの色の統一がゲーム性に関わる重要な処理であると仮定し、
クライアント2人の環境で同じ色になるように実装を考えてみましょう。
■実装について
〇ランダム値を確定させる環境を決める
まず、各環境で勝手にランダム値を決定してしまうのは問題ですので
サーバ環境、クライアント環境のいずれかで確定させた情報を
他の環境へ伝達する方針で実装してみます。
ランダム値の算出に関してはサーバ環境で問題無く処理される為、
今回は分かりやすくサーバ環境で確定させるものとします。
〇アクターのReplicates設定を有効化する

これにより、サーバーの情報がクライアントで再現されるようになります。
これから2つの方法をご紹介しますが、その下準備と捉えてもらって問題無いかと思います。
方法①Multicastを使用してサーバからクライアントへ情報を伝達する
サーバからイベントを実行する形で、クライアントへ情報を伝達する方法です。
・使用例
まずはクライアント側の処理から。
※厳密にはサーバ側でも処理が行われますが、ここでは割愛します

グラフ上でイベント「MC_Overlap」を新規作成し、設定から「Replicates」を「Multicast」に変更します。
そして、追加したInputsピンを使用して数値を反映させるようにしましょう。
次にサーバ側の処理です。

Overlap関数は全環境で処理される為、サーバでのみ処理が実行されるよう判定を加えています。
あとは先程作成した「MC_Overlap」を呼び出すだけです。
※補足
[UE5] 一度は試していただきたいテストレベル用機能3選
上記の記事でも少し触れていますが
Actorの設定「NetCullDistanceSquared」の距離外に存在するアクターには情報が伝達されず
処理が一切行われない為、ご注意ください。
方法②RepNotifyを使用してサーバからクライアントへ情報を伝達する
変数のReplication設定を利用し、RepNotify関数経由で情報を伝達する方法です。
・使用例
下記の画像内の順番で変数の作成、設定を行います。

次にクライアント側の処理です。
※厳密にはサーバ側でも処理が行われますが、ここでは割愛します
作成されたRepNotify関数「OnRep_ColorIndex」内に反映処理を追加します。
ここで、先程作成した変数を使用します。

最後にサーバ側の処理です。

先程追加された変数に値を入れるだけです。
■さいごに

ランダムな値を統一した上で、伝達、反映させる方法を2つご紹介しました。
今回はサーバ環境で値を確定させましたが
事前にどの環境から、どのように情報を伝達するのか設計してから
実装に取り掛かるようにしましょう。
本記事で説明し切れていないMulticastやRepNotifyの
より詳細な仕様や挙動に関しては
後述のリンク集にて掲載させていただいているスライドが
非常に分かりやすいので、是非併せてご覧ください。
■リンク集
「UE4 MultiPlayer Online Deep Dive: 実践編1」スライド(株式会社Byking様)
https://www.docswell.com/s/EpicGamesJapan/5WXDDZ-ue4-multiplayer-online-deep-dive-1-byking-ue4dd