マルチプレイヤーゲーム作成の基本のキ pate UE歴:3年 https://twitter.com/mx_pate4 https://zenn.dev/pate_techmemo © 2023 Model ingX Inc. 1
もくじ 1. UEにおけるマルチプレイの仕組み 2. ゲームプレイフレームワーク 3. RPCについて 4. チャット機能の例 5. まとめ 6. 参考文献 © 2023 Model ingX Inc. 2
UEにおけるマルチプレイの仕組み © 2023 Model ingX Inc. 3
Listen ServerとDedicated Server UEはClient-Serverモデルを採用している Client-Serverモデル ・・・ サーバーが全ての情報を管理し、Clientに同期する仕組み Listen Server Dedicated Server Dedicated Server Listen Server (Client + Server) Client Client Client Client © 2023 Model ingX Inc. Client Client 4
Listen or Dedicated Listen Server メリット • • • 無料で実装可能 サーバーを構築しなくてよい 環境によってはDedicated Serverよりもレスポンスがよい デメリット • • • ホストに処理と通信が集中しやすい ホストの通信状態が悪いとセッション全体が重たくなる ホストが切断されると全てのセッションが終了する Dedicated Server メリット • • • 特定のClientに処理が集中せず、負荷が安定している 通信状態が他のClientの影響を受けにくい Clientが切断されてもゲーム進行は止めなくても良い デメリット • • • サーバー構築、保守、通信にコストがかかる ほぼ毎回ターゲットServerと一緒にパッケージ化が必要 ソースコードビルドしたエンジンが必要 © 2023 Model ingX Inc. 5
ゲームプレイフレームワーク © 2023 Model ingX Inc. 6
よくみるやつ・・・ © 2023 Model ingX Inc. 7
ゲームプレイフレームワークとは BPクラスには様々な役割を持ったクラスが用意されている。 その中でもマルチプレイを実装する際に重要なクラスをご紹介。 © 2023 Model ingX Inc. 8
ざっくりそれぞれの役割① GameInstance ゲーム中、永続的に存在するクラス。 ログイン時とログイン後でレベルが変わる場合は、ログ イン情報を保持できる唯一のクラスになる。 GameState サーバーとクライアントを繋ぐ仲介役 クライアントがアクションを起こしたとき、GameStateに反 映させてからクライアント全員に反映する、という動きを してくれる。 サーバー、各クライアントに存在する。 サーバー、各クライアントに存在するが、みんなで1つの GameStateを共有している。 GameMode PlayerControllerとお友達。 OnPostLoginやOnPostLogoutイベントが用意されていて、 ログイン、ログアウト時の処理ができる。PlayerController も取得できる。 Pawn PlayerControllerによくPossessされている。 GameModeでログインしたプレイヤーに対し、スポーンし たポーンにPlayerControllerをPossessする。話はそれか らだ。 サーバーにのみ存在する。クライアントはなし。 サーバー、各クライアントに存在する。 © 2023 Model ingX Inc. 9
ざっくりそれぞれの役割② PlayerController マルチプレイの最重要人物。 自分のHPや所持アイテムなどを変更する際は、 PlayerControllerからサーバーに送る。Widgetに反映さ せる際もここを通して変更するので、サーバーへの窓口 はこちらです。 Widget Widgetのイベントが実行されたとき、PlayerControllerを 介してサーバーにイベントを送信する。 UIはサーバーには存在せず、所有クライアントにのみ存 在するので、サーバーからWidgetまで情報を同期する のにクラスを複数仲介させるのが面倒だったイメージ。 サーバーには全員の、クライアントは自分の PlayerControllerのみ存在する。 サーバーに存在せず、所有クライアントにのみ存在する。 PlayerState 名前の通りプレイヤーの状態を管理するクラス。 HPやスコアなど。マルチプレイ対戦ゲームを作るときは 必ず使うことになるかと。 サーバー、各クライアントに存在する。 © 2023 Model ingX Inc. 10
RPC(リモートプロシージャコール) © 2023 Model ingX Inc. 11
RPCとは ネットワーク越しに別環境の関数やイベントを呼び出す手法 BPではカスタムイベントを作成して使用する デフォルトは「複製しない」 「詳細」タブに設定項目が出てくる カスタムイベントを選択 © 2023 Model ingX Inc. 12
RPCについての参考 https://historia.co.jp/archives/12823/ © 2023 Model ingX Inc. 13
チャット機能の例 © 2023 Model ingX Inc. 14
実例 メタバース空間 個人からチャットを送信すると空間内にいる全員にメッセージが表示される 日付:時刻:プレイヤーネーム:メッセージ が送信される メッセージを打ち込む © 2023 Model ingX Inc. 15
送信 → 全員に表示までの流れ Widget PlayerController GameState RPC(サーバーで実行)で メッセージを送信 仲介役としてサーバーに送信 Chat Message配列に格納 RepNotify 格納されたメッセージをWidget に送信 メッセージを表示 © 2023 Model ingX Inc. 16
全員に送信できる仕組み サーバーならAuthority クライアントならRemote © 2023 Model ingX Inc. 17
もう少しわかりやすく・・・? サーバーはSwitchHasAuthorityで 処理が止まる Chat Message配列に格納される メッセージを サーバーに送信 Hello Client Server RepNotify RepNotify Hello Hello Hello Client Client Client © 2023 Model ingX Inc. 18
まとめ • ListenServerとDedicatedServerがあり、それぞれにメリットデメリットがある。やりたいことによって使い分けよう。 • UEにはマルチプレイゲームを作るのに必要なクラスが用意されている。役割を理解して使おう。 • RPC?所有権?Replicate?なんもわかんねぇ! • 作って覚えましょう。 もっと詳しく知りたい、質問等あればお声掛けください。 © 2023 Model ingX Inc. 19
参考文献 • Epic公式 https://docs.unrealengine.com/5.1/ja/networking-and-multiplayer-in-unreal-engine/ • alweiさんのブログ https://unrealengine.hatenablog.com/entry/2021/02/23/232048 • historiaさんのブログ https://historia.co.jp/archives/12823/ • タケゾーさんのブログ https://www.main-function.com/entry/2017/11/22/220527 © 2023 Model ingX Inc. 20