4.5K Views
January 20, 25
スライド概要
UEノンゲームエンジニア兼一般経済学部系大学生
今から始める ネットワーク マルチプレイ 月ヶ瀬
自己紹介 月ヶ瀬 理緒 @Gisu_Love • UE歴4年目 • 最近遊戯王にはまったので大須の周 辺のカードショップで発見できる • ディプロス株式会社のノンゲームエ ンジニアとTAの間のようなポジ • X(Twitter)によくいるので気軽に話 しかけてください
はじめに • コード書きません • BPは書けるけどマルチはやったことがない人向け • 体験談がかなり含まれます(詳しい方は生暖かい目で見てくだ さい) • 間違い/修正などはご気軽にご連絡下さい(Twitterなど)
今日の内容 • UEのサーバーについて • とりあえずネットワークマルチをしてみよう • 同期について考える • 所有権について考える • ちょっと応用 シームレストラベル • もうちょっと応用 EOSでセッション立ててみる
・接続形態/ホスト方法について
接続形態について • P2P(Peer to Peer)型 • Client Server型 端末同士を直接接続して通信する プレイヤーはサーバーにのみ接続する Unreal Engineはこっち!
ゲームをホストする方法 • Listen Server • Dedicated Server セッション作った端末でサーバーとクラ イアント両方が実行される サーバーにローカルのプレイヤーが存在 する 専用のサーバーが不要なので比較的簡単 専用サーバーを用意し、プレイヤーは サーバーに接続する方式 サーバーにローカルのプレイヤーが存 在しない いろいろ大変 今日話すのはこっち!
・とりあえずネットワーク マルチにしてみよう
PIEでマルチする • Playボタンの横からネットモードと人数を設定することでマル チでPIEをプレイすることができる
IP直接続 • ホストになるPlayerのIPv4アドレスをクライアントが直打ちして接続する • 一番わかりやすく同一ネットワーク内ならこれで十分動く
Online Subsystemでセッションする • デフォルトで入っているプラグインのOnline Subsystemを使って セッションを作成・参加する • IPを打つことがなく同一ネットワーク内のセッションに参加できる • Collab Viewerで使用されている
よっしゃ!マルチプレイ簡単や!
…とはならない
このままだと… 椅子をSpawnします! クライアントA いや、しらんけど… サーバー サーバーが知らない なら知らないよ クライアントB クライアントがやったことをサーバーは知らない、のでホストに もほかのクライアントにも同期されない
・同期について考える
UEの同期するための動き • UnrealEngineで同期される動きは 1.サーバーで実行する 2.クライアントに複製する に分解できる 椅子Spawn したいんだけど クライアントA いいよー サーバー 作ったよー サーバー やったー クライアント達
椅子をスポーンしたいんだけど …を、実際に行うのが RPC Remote Procedure Call) (
RPCの種類 • RPCは Run on Server(サーバーで実行) MultiCast(すべてで実行) Run on Client(所有しているクライアントで実行) の3種類ある
RPCの作り方 • カスタムイベントの詳細タブにある 「複製する」のドロップダウンから 選ぶことでRPCにすることができる
Run on Server • このノードに続けられた処理 をサーバーで実行する • BPで何かの同期がいるイベン トを起こしたい場合、ほぼこ のノードを使う サーバーさん! 椅子をSpawnし てください! クライアントA クライアントか ら連絡来たな… 椅子を作ってほ しい? サーバー
MultiCast • このノードをサーバーで実行 した場合、クライアントと サーバーで同じノードが実行 される 椅子の皆さんは 180度回転して くださいね~ なんか回転する らしいぞ~ クライアントA の椅子 サーバー サーバー の椅子 クライアントB の椅子
Run on Client • このノードをサーバーで実行し た場合、所有権を持っているク ライアントで実行される • でも所有権って大体サーバーが 持っているのであまり使わない このUI持ってる でしょ?HP変え といて 持ってます! 変えときます サーバー クライアントA
RPCは完璧だ!早速椅子を作ってみよう! 椅子Spawn したいんだけど クライアントA いいよー サーバー … サーバー あ、あれ…?椅子は…? クライアント達 …そう、まだ「作ったよ~」とお知らせするパラメーターがある
Replicateする • 同期したいすべてのActorはReplicateされる必要がある • Actorの詳細欄やSet Replicationノードで設定できる
もっとReplicateする • Replicateしただけではすべて同期されるわけではなく、Actor を動かしたりcomponentを動かすには追加のReplicateの設定 を行う必要がある 動きを同期するReplicate Movement コンポーネントを同期するcomponent Replicate
変数をReplicateする • 変数はサーバーの変数をSetしたときに自動的にクライアント に複製する設定がある • 変数の詳細のレプリケーションから設定できる
ReplicatedとRepNotifyの違い • Replicated • RepNotify サーバーでSetされた際に自動 的にクライアント側に変数の 値が複製される。 サーバーでセットした後、自動的にクライア ント側に変数の値が複製され通知が入る RepNotifyの変数を作ると関数が作成され変 数がセットされると呼び出される
よし!同期は完璧だ! レベル上のドア、 Run on Serverで 開けちゃうぜ~! あ、あれ… クライアントでも ホストでも開かな いぞ… シーン… クライアントA クライアントA 次回:所有権とかいうよくわかんない罠
・所有権について考える
所有権とかRoleとか呼ばれるものについて • すべてのActorには所有権が設定されている • SpawnしたものはSpawn した人が所有権を持つ • レベルに配置されているものは各個プレイヤーが所有する • 所有している人とモノによってロールが変わる Run on Serverでスポーン したもの、全部所有して ます サーバー サーバーに黙ってローカルで スポーンしたReplicateされて ないActorやUI、レベルの Actorを所有してます クライアント
Roleの種類 • Authority なんでもできる奴。偉い。 大体サーバーにいる • Autonomous Proxy Authorityになんか言える珍しい ロール。このロールなのでPlayer ControllerとPawnは偉い。 • Simulate Proxy ローカル内だけでの処理と サーバーの複製しかできない
所有権とロールの対応 物\所有してる人 Server Client Player Controllerと PossessされているPawn Authority Autonomous Proxy Replicateされている Actor Authority Simulate Proxy Replicateされていない ローカルで生成されたActor Authority Authority
レベルに置かれたドアで起きたこと ドア開けて あなたそんな権限 ありませんよね? いいよ~ Run on Server サーバーのドアへ ドアを開けてください それをコピーします クライアントA 所有権が クライアントAのドア 所有権がサーバーのドア
どうすればよかったのか サーバーの俺、 ドア開けて ひらけドア! いいよ~ サーバー上の クライアントA クライアントA 複製できた! 所有権が クライアントAのドア サーバー上のクライアン トのPlayer Controllerか らのお願いなら…まあ… 所有権が サーバーのドア サーバー
いるとかいないとかの話 • すべてのActorがすべてのPlayerに複製されているわけではない こっちの世界、Player controller自分しかいな いんだけど… ローカルで生成され たもの以外大体全部 情報持ってます サーバー クライアントA
Game Mode Game State Game State Game State Player State Player State Player State Player State Player State Player State Player State Player State Player State Pawn Pawn Pawn Instance Instance PC サーバーの世界 PC クライアントAの世界 Instance PC クライアントBの世界
•MultiCastなどで沼りがちなので気を 付けよう!
・ここからちょっと応用
シームレストラベルについて
マルチプレイでのレベル遷移 • マルチプレイの状態の時、サーバーがOpen Levelしてもクライ アントはついていくことができない 自分次の○○って Mapに行くんで サーバー どこそれ… クライアントA
シームレストラベルを使う • Game ModeのUse Seamless Travelを 有効にします • 空のレベルを作り、 プロジェクト設定の マップ&モードから 遷移マップに設定し ます。 • Execute console commandで 「servertravel/Game以下移動 したいレベルのパス」 とサーバーで唱えます
レベル移動できた!
もうちょっと応用: EOSを使ってみる
EOSってC++必須じゃないんですか? • UdemyでC++を使用したEOSでのオンラインゲーム制作の講座 を販売している方がプラグインを出しているので使ってみた https://www.udemy.com/course/unreal-engine-5-cpp-multiplayershooter/?referralCode=627D7FD010D0E0E49592&couponCode=D UMMY25116 他にもBPだけで組めるようにするプラグインを出している方は たくさんいる
Developer Portalから製品を設定する • Enterpriseのシートの購入などに使われる組織を作成し、 Developer Portalから新しい製品を作成する
クライアントとポリシーを作成する • 製品設定のクライアント から新規のポリシーなど を作成する • ここでゲーム内実績をつ けるかなどを設定できる
製品情報を設定する • Epicアカウントサービスからアクセス許可などを設定する
Developer portal側の設定完了!
プロジェクトファイルを操作する • Third Person テンプレートでプロジェクトをC++作成し、Online Subsystem EOSを追加する
Default Engine .iniを書き換える • Default Engine .iniの最後にEOS用の設定を付け足す [OnlineSubsystemEOS] bEnabled=true [OnlineSubsystem] DefaultPlatformService=EOS [/Script/Engine.GameEngine] +NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemEOS. NetDriverEOS",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver") [/Script/OnlineSubsystemEOS.NetDriverEOS] bIsUsingP2PSockets=true
EOSのプラグインの設定をする • プロジェクト設定のOnline Subsystem EOSから ・エピックアカウントにログイン ・クロスプレイ用のユーザーID にチェックを入れる 必要に応じて下の実績についてやクロスプレイもオンにする
IDやキーを設定する • EOSの製品情報からIdなどをコピーしてEOSの設定に貼り付け る • 暗号化キーにはとりあえず0を64個入れておく
プラグインを入れる • MultiplayerCourseMenuSystem https://github.com/DruidMech/MultiplayerCourseMenuSystem をダウンロードしてプラグインを先ほど作ったプロジェクトに移 植し、VSファイルを再生成する プラグインは5.1まで
UIを作成する • プラグイン独自のUMGクラスのMenuの子としてウェジットを作 成する • プラグイン独自の命名規則に沿ったボタンを作っておく
UIを表示する • レベルBPでCreate Widget をしてAdd to Viewportではなく独自の 関数でロビーを開くようにする
そしてパッケージ化…
NAT越えできない • 出来上がったパッケージではNAT越え(つまり別のネットワー クとの接続)ができなかった • 設定などに問題がありそうなので、今後も研究してうまくいっ たらまたしゃべっているかもしれない
参考にさせていただいたもの • UE4でマルチプレイゲームをつくろう https://www.docswell.com/s/EpicGamesJapan/ZWX64KUE4_CEDEC19_MultiPlayerGame?utm_source=twitter&utm_mediu m=social&utm_campaign=singlepage • C++コードはいらない!UE4で作るお手軽マルチプレイネット ワークゲームについて https://www.docswell.com/s/alwei/KRW71Z-2022-05-12152255?utm_source=twitter&utm_medium=social&utm_campai gn=singlepage • 【UE4/UE5初心者向け】オンラインマルチプレイ入門編 https://youtube.com/playlist?list=PLfKehW5Urkqu4DXGJCgWZCxweW9qjnsv&si=yWPnzmW2SdRLnD7a
• UE4/5におけるオンラインマルチプレイ(導入編) https://www.docswell.com/s/yoshikata/54W6GK-2022-07-09183611?utm_source=twitter&utm_medium=social&utm_campaig n=singlepage • [UE4] マルチプレイでの所有権とRPC https://historia.co.jp/archives/12823/ • UE4 ネットワークマルチプレイヤーゲームを作る時の役割につ いて • https://unrealengine.hatenablog.com/entry/2021/02/23/232048 • Unreal Engineでオンラインゲームを作るための技術について https://www.docswell.com/s/alwei/58G89P-2024-03-17232045?utm_source=twitter&utm_medium=social&utm_campaig n=singlepage
まとめ • ネットワークマルチプレイは仕組みがわかれば怖くない! • みんなもマルチゲームを作ろう!