21K Views
February 19, 18
スライド概要
2018年2月17日に行われた「UE4プログラマー向
け勉強会 in 大阪」で登壇した際に使用した資料です
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Online MultiPlay Game Design Epic Games Japan / Support Engineer Ken Kuwano #UE4Osaka
Gale • • • • C++とBlueprintの使い分けた設計 Engineが提供する機能 各種機能を実現するフロー ネットワーク機能 #UE4Osaka
Agenda • UE4のネットワーク機能 • Online MultiPlay Game の 概要 • Online MultiPlay Game の 設計 • Online MultiPlay Game の ネットワーク機能 • ネットワークTips #UE4Osaka
UE4のネットワーク機能 #UE4Osaka
UE4 Networking • Server / Client 構成 Listen Server #UE4Osaka Dedicated Server
UE4 Networking • Replicate Server / Client間でのパラメータの複製、同期 Actor Replicate Property Replicate #UE4Osaka
UE4 Networking • OSS (Online Subsystem) UE4が提供する、各種プラットフォームに対してオンライン通信機能を提供す るための抽象化されたサブシステム、フレームワーク Steam Game Inter face PS4 Driver Server XBox Switch OSS Profile, Matchmake, Leaderboards, SharedCloud, Achievements, Voice, など... #UE4Osaka
#UE4Osaka
#UE4Osaka
Online MultiPlay Game の 概要 #UE4Osaka
概要 • ゲーム – FPS形式のガンシューティング – PvP または PvE • 機能 – – – – – 対戦 マッチング ランキング アチーブメント リプレイ #UE4Osaka
概要 • コンテンツ – Blueprint + C++ – 各種プラットフォーム対応 – ネットワーク機能のサンプル • 起動方法 – PackageまたはVSからDevelepmentなどで起動 – PC1台でもOnline接続の確認は可能 #UE4Osaka
ゲームフロー Menu #UE4Osaka Matching Game Menu
Online MultiPlay Game の 設計 #UE4Osaka
シングルプレイの場合は #UE4Osaka
Standalone Game Standalone GameMode GameInstance #UE4Osaka Pawn SpectorPawn GameState PlayerController PlayerState HUD / UMG
マルチプレイの場合は #UE4Osaka
Multiplay game Server Server Match Level GameMode PlayerState1 GameState PlayerState2 Pawn1 Pawn2 PlayerController1 PlayerController2 GameInstance GameInstance HUD / UMG HUD / UMG Client 1 #UE4Osaka Client 2 Client1 Client2
Game Design • Core GameEngine, GameInstance • System GameMode, GameState, GameSession, GameViewportClient, GameOnlineSessionClient • Player Contents PlayerState, PlayerController, PlayerCameraManager • Game Contents Character, Weapon, Bot, Item • Misc GameUserSettings, CheatManager, SaveGame ※ Shooter Gameでの例です… #UE4Osaka
GameEngine Engine C++ Blueprint #UE4Osaka UGameEngine UShooterEngine ゲームシステム管理基底クラス アプリケーションの管理, Window制御 ゲーム独自の管理 ネットワークエラー検出処理
GameInstance Engine C++ Blueprint #UE4Osaka UGameInstance UShooter GameInstance ゲーム中の高レベルな管理クラス ローカルプレイヤー管理, ネットワークエラー検知 TimerManager, LatentActionManager管理, など ゲーム独自の管理クラス セッション管理, ネットワークエラー表示, DemoRecord制御
GameInstance Serverが終了 • サーバーとの接続エラー表示 マッチング 終了 #UE4Osaka
GameMode AGameModeBase ゲームルール基底 ログイン, プレイヤー管理, Controller管理 Engine AGameMode C++ AShooter GameMode ゲームのルール ログイン処理, Bot生成など Game基底 KillScore, DeathScore, BotCount, など AShooterGame _TeamDeathMatch チーム戦用 Blueprint #UE4Osaka ゲームルールのサブクラス マルチプレイヤーマッチに特化 AShooterGame _FreeForAll 1対1戦用 AShooterGame _Menu メニュー用
GameMode • World毎に設定 – ゲームルール毎に設定 チーム戦用 #UE4Osaka 1対1戦用 メニュー用
GameState AGameStateBase ゲーム状態管理基底 ゲーム共通の状態管理, サーバー時間, PlayerState, など Engine AGameState C++ Blueprint #UE4Osaka AShooter GameState ゲーム状態管理のサブクラス マルチプレイヤーマッチに特化 ゲームの状態 チーム数, チームスコア, 残り時間, など
GameState • GameMode毎に設定 1対1戦用 GameMode #UE4Osaka メニュー用 GameMode
GameSession Engine C++ Blueprint #UE4Osaka AGameSession AShooter GameSession SessionとGame固有のラッパークラス Session最大参加者数, Session観戦者数, Session名 ゲーム独自のSession制御 Session情報, Sessionコールバック
GameSession • GameMode毎に設定, 未設定も可能 GameMode #UE4Osaka GameSessionClassの選択は任意 (”NoClear”を付与するとNoneが未選択)
GameViewportClient Engine UGame ViewportClient ViewportとEngineのIFクラス Rendering, Audio, Inputをハンドルするサブシステム C++ UShooterGame ViewportClient ゲーム独自のViewport制御 ダイヤログ, ローディング画面, プレイヤー追加通知表示 などの割込みの可能性があるものを表示 Blueprint #UE4Osaka
GameViewportClient • ゲーム中で1つのみ #UE4Osaka
GameOnlineSessionClient Engine UGame OnlineSessionClient ローカルプレーヤーのOnlineSession管理 C++ UShooterGame OnlineSessionClient ゲーム独自のOnlineSession管理 別のプレイヤーの参加通知 Blueprint #UE4Osaka
PlayerState Engine C++ Blueprint #UE4Osaka APlayerState AShooter PlayerState プレイヤー情報 プレイヤー名, プレイヤーID, Score, など ゲーム独自のプレイヤー情報 TeamNo, KillCount, DeathCount, GameScore, など
PlayerState • GameMode毎に設定 GameMode ゲームルール GameState ゲーム情報 1対1戦用 GameMode #UE4Osaka PlayerState プレイヤー情報 情報の管理/制御先に注意
PlayerController Engine C++ APlayerController PlayerController基本 PlayerのPawn制御 AShooter PlayerController AShooter PlayerController_Menu InGame用 Blueprint #UE4Osaka ・観戦者カメラの設定 ・チート制御 ・チャット制御 ・メニュー/スコアボード表示 Menu用 ・初期化 メニューUI初期化 AShooter DemoSpectator DemoRecord用 ・初期化 DemoRecordUI初期化
PlayerCameraManager Engine APlayer CameraManager C++ AShooterPlayer CameraManager Blueprint #UE4Osaka Playerのカメラ制御基底クラス ゲーム独自のカメラ制御 位置, 回転の更新
PlayerCameraManager • FirstPersonTempleteと異なりCharacterにCameraがない – ViewTargetを更新、PCMはキャラクターに追従し同期 FirstPerson #UE4Osaka ShooterGame
Character • プレイヤーキャラクター - 移動 ジャンプ ターン 走行 射撃 エイム 武器切替 リロード 主に入力の制御処理 #UE4Osaka
Character Engine C++ Blueprint #UE4Osaka ACharacter AShooter Character PlayerPawn キャラクター基底クラス 移動, ジャンプ, 位置通知(ネットワーク同期) ゲーム独自のキャラクター キャラクター処理 (ダメージ, 死亡, 武器(追加/発砲)) アニメーション制御, 入力制御 パラメータ設定用
Character - Input #UE4Osaka
Character #UE4Osaka
Character Engine C++ Blueprint #UE4Osaka ACharacter USkeletalMesh Component UAnimInstance UCharacterMovement Component AShooter Character PlayerPawn UShooterMovement Component HeroTPP _AnimBlueprint HeroFPP _AnimationBlueprint キャラクター全身 エイム用腕のみ
Character - Animation #UE4Osaka
Character - Animation #UE4Osaka
Character - Animation #UE4Osaka
Character - Animation #UE4Osaka
Weapon 2種類の武器(Gun/Launcher) - 攻撃がヒットしたらダメージを与える - 攻撃がヒットしたら指定のエフェクトを発生させる - 攻撃を行ったら指定のサウンドを再生する Gun • Gun 入力している間攻撃し続ける(速射式) 攻撃の判定はTraceで行いDamageを与える ・Launcher 入力する毎に弾を発射する(発射式) 弾がHitした位置を基準に範囲内でDamageを与える Launcher #UE4Osaka
Weapon Engine AActor AShooterWeapon C++ 武器基本 AShooterWeapon _Instant 速射武器 Blueprint WeaponGun 速射銃 #UE4Osaka AShooterWeapon _Projectile AShooterProjectile 発射武器 WeaponLauncher ランチャー 弾 ProjRocket ロケット弾
Bot • プレイヤーと同型のキャラクター • 動作は全てAI • Gunのみ使用(Launcherは未使用) #UE4Osaka
Bot Engine ACharacter AIController AShooter Character C++ AShooterBot UBehaviorTree Bot基本 Blueprint PlayerPawn BotPawn BotBP #UE4Osaka AShooter AIController
Bot - AIController Engine C++ Blueprint #UE4Osaka AIController AShooter AIController AIController基底クラス AIで制御するPawnのコントローラ UBlackboard Component UBehaviorTree Component Bot用AIController Blackboard, BehaviorTreeと連動し てAI動作制御
Bot - Behavior Tree 3 1 4 2 5 行動パターン 1. 索敵:最も近い敵を見つける 2. 攻撃:ターゲットに攻撃 3. 補充:弾薬を見つけて移動 4. 移動:攻撃対象まで移動 5. 待機:待機 毎フレーム実行する処理が多い #UE4Osaka
Bot - Service 索敵 射撃 ShooterAIController (C++) #UE4Osaka
Item • 2種類のアイテム - 弾薬回復(Gun, Launcher) - 体力回復 • 一定時間で自動的にRespawn • 取得時にSE再生 • 取得時にVFX再生 など #UE4Osaka
Item Engine AActor UCapusule Component AShooterPickup C++ 取得時処理, Respawn処理 取得時SE, 取得時VFX アイテム基本 AShooterPickup _Ammo 補充弾数 武器種別 AShooterPickup _Health 弾アイテム Blueprint Pickup _AmmoGun 速射銃弾 #UE4Osaka 体力回復量 体力アイテム Pickup _AmmoLauncher ランチャー弾 Pickup _Health 体力回復
Item Pickup_AmmoGun #UE4Osaka Pickup_Health
GameUserSettings Engine C++ Blueprint #UE4Osaka UGame UserSettings UShooterGame UserSettings ユーザー設定 ゲームのユーザー設定(Graphics, Soundなど)を保存し、 ファイルの保存と読み込みが可能 ゲーム独自のユーザー設定 描画品質設定, マッチング時のLAN接続設定, など
CheatManager Engine C++ Blueprint #UE4Osaka UCheatManager UShooter CheatManager チートマネージャクラス ゲームに同梱されていないテストおよびデバッグコード やアクションを実装するためのクラス ゲーム独自のチートマネージャクラス 弾無限, 体力無限, Botの強制Spawn, など
SaveGame Engine C++ Blueprint #UE4Osaka USaveGame UShooter PersistentUser セーブデータ基底クラス ゲームに関する状態を保存するために使用できるセーブ ゲームオブジェクトの基本クラス ゲーム独自のセーブデータ ユーザーが次回以降も引き継ぐデータの情報 KillCount, DeathCount, WinsCount, LossesCount, Vibration, InversedYAxis, など
Online MultiPlay Game の ネットワーク機能 #UE4Osaka
ゲームフロー Menu #UE4Osaka Matching Game Menu
ゲームフロー Menu Matching Matchmake #UE4Osaka Game Character Move Shoot Menu
Matchmake • Server / Clientの接続はSessionで行う Menu Map Server Matching Map Create Session Client Find Session #UE4Osaka Join Session
Matchmake - Server MainMenu FREE FOR ALL or TEAM DEATMATCH GameInstance GameSession Create Session Create Session Complete UWorld::ServerTravel() Matching Levelへ #UE4Osaka OnlineSession InterfaceXX
Matchmake - Client MainMenu SERVER GameInstance GameSession Find Session Find Session Complete Select Server Join Session Join Session Complete PlayerController::ClientTravel() Matching Levelへ #UE4Osaka OnlineSession InterfaceXX
Game - Shoot Client1 Server Client2 Client3 Input AShooterCharacter ::StartWeaponFire AShooterWeapon ::StartFire RPC AShooterWeapon ::ServerStartFire AShooterCharacter ::TakeDamage Health減少 Replicate Animation #UE4Osaka
ネットワークTips #UE4Osaka
ネットワークTips • • • • • • • Leaderboard Achievements ReplaySystem Profiler Logging Console Command 制約 #UE4Osaka
Leaderboard • MainMenu スコア, ランキング機能 - ShooterGameではSShooterLeaderboardで UI表示が実装 OlineLeaderboard InterfaceXXX Open SShooterLeaderboard ::ReadStats() ReadLeaderboardsForFriends PlayerController ゲーム終了 AShooterPlayerController ::UpdateLeaderboardsOnGameEnd() WriteLeaderboards #UE4Osaka
Achievements • PlayerController 実績機能 - ShooterGameでは主にPlayerControllerからアクセス - DefaultEngine.iniで各種設定 OlineAchievements InterfaceXXX ゲーム開始 AShooterPlayerController ::QueryAchievements() QueryAchievements ゲーム終了 AShooterPlayerController ::UpdateAchievementProgress () WriteAchievements #UE4Osaka
ReplaySystem • リプレイ機能 – Replicationの情報を元に状況を再現 – DemoNetDriverの機能を利用 (.iniファイルで設定が設定要) – リプレイ情報保存先:[Project]/Saved/Demos #UE4Osaka 公式ドキュメント https://docs.unrealengine.com/latest/INT/Engine/Replay/
Network Profiler • NetworkTrafficを解析するツール – コンソールコマンドでパケット情報を収集 (“netprofile”など) – アプリケーション保存先:Engine¥Binaries¥DotNET – 収集ファイル保存先:[Project]/Saved/Profiling #UE4Osaka 公式ドキュメント https://docs.unrealengine.com/latest/INT/Gameplay/Tools/NetworkProfiler/
Logging • ログ出力レベルを変更することでネットワーク関連の情報が取得 • ログ出力レベルについて [UE4] UE_LOGについてあれこれ http://historia.co.jp/archives/5532/ • ログ出力マクロについて Log Macro with Netmode and Colour https://wiki.unrealengine.com/Log_Macro_with_Netmode_and_Colour #UE4Osaka
Network関連Log (1/2) # Log 1 LogCharacterNetSmoothing Description Verbosity (橙色:使用, 〇:初期設定) No Logging Fatal Error Warning Display キャラクタ移動補間関連ログ出力 Log 〇 2 LogCookedIterativeNetworkFile CookOnTheFly時ファイル関連ログ出力 〇 3 LogGameNetworkManager ネットワークマネージャ関連ログ出力 〇 4 LogHandshake 3-Wayハンドシェィク関連ログ出力 〇 5 LogNet ネットワーク関連イベント出力 〇 6 LogNetDormancy ネットワーク休止イベント出力 〇 7 LogNetFastTArray ネットワーク動的配列関連ログ出力 〇 8 LogNetPackageMap パッケージマップ関連ログ出力 〇 9 LogNetPartialBunch データチャネル関連ログ出力 〇 10 LogNetPlayerMovement キャラクタ移動関連ログ出力 〇 11 LogNetSerialization シリアライズ関連ログ出力 〇 12 LogNetTraffic ネットワーク情報パケットログ出力 〇 13 LogNetVersion ネットワークバージョン出力 #UE4Osaka 〇 Verbose Very Vorbose Note
Network関連Log (2/2) # Log Description Verbosity (橙色:使用, 〇:初期設定) No Logging Fatal Error Warning Display Log 14 LogNetworkAutomationTests ネットワーク自動テスト時ログ出力 〇 15 LogNetworkPlatformFile ネットワーク経由ファイル操作関連ログ出力 〇 16 LogOnline OSS関連イベントやパラメータの出力 17 LogOnlineChat Chatroom関連イベントの出力 〇 18 LogOnlineGame LobbyBeacon使用時のユーザー情報出力 〇 19 LogOnlineParty パーティ関連のログ出力 〇 20 LogRep レプリケーションイベント/パラメータ出力 21 LogRepTraffic レプリケーション情報出力 22 LogSkippedRepNotifies レプリケーション通知スキップ情報出力 23 LogTcpMessaging TCPメッセージ関連出力 〇 24 LogUdpMessaging UDPメッセージ関連出力 〇 25 PacketHandlerLog PacketHandler、暗号化、復号関連出力 〇 #UE4Osaka Verbose Very Vorbose Note UnUsed 〇 UnUsed 〇 〇 〇
Console Command • 設定を動的に変更したり指定の情報を出力することが可能 • ネットワーク関連のコマンドは”net.***” • Help->Console Variablesから一覧表示 #UE4Osaka
Network関連Console Command (1/3) # 1 2 3 4 5 6 7 Command Description net.AllowAsyncLoading 非同期ロード設定 PackageMapを元にNetGUIDからオブジェクトを非同期でロードする PacketHandlerコンポーネントをロードして?EncryptionToken = URLに基づいて NMT_HelloメッセージのEncryptionTokenパラメータを入力 net.AllowEncryption net.ContextDebug Replication情報にデバッグ用文字列を設定してログに詳細な情報を表示 net.DormancyEnable 頻繁に更新されるアクターのCPUおよび帯域幅のオーバーヘッドを削減するネット ワーク休止システムの有効化 ネットワーク休止システムのデバッグ情報の描画 net.DormancyDraw net.DormancyDrawCullDistance net.DormancyValidate net.DormancyDrawのCulling距離, World単位 localのViewから離れているActorの休止状態を描画する 休止状態のときに休止状態のActorが状態を変更しないことを検証 8 net.DelayUnmappedRPCs マッピングされていないプロパティを持つ受信RPCを遅延させる設定 9 net.DeleteDormantActor 休止中のActorを削除 10 net.DoPropertyChecksum 11net.DumpRelevantActors ReplicationデータのSumCheck実行可否 次回ネットワーク更新時に関連するActorの情報を出力 12 net.IgnoreNetworkChecksumMis Network上でのSumCheckエラーを無視する設定 match net.InstantReplayProcessQueued インスタントリプレイ中にQueに入れられたBunchを処理するための時間の閾値 13 BunchesMillisecondLimit 閾値を超過する場合次のフレームまで待ってQueに入れられたBunchの処理を続行 #UE4Osaka Type Default Note Int32 0 0:非許可 1:許可 Int32 1 0:無効 1:有効 Int32 0 Int32 1 Int32 0 Float 5000 Int32 0 Int32 0 ー ー Int32 0 ー ー Int32 0 0:エラー無視 1:エラー検知 Int32 8 0:無制限 0:無効 1:有効 0:無効 1:有効 0:無効 1:有効 0:検証しない 1:起動時に検証 2:更新時に検証 0:無効 1:有効 0:無効 1:有効
Network関連Console Command (2/3) # Command Description Type Default 14 net.ListActorChannels ActorChannelのリスト一覧表示 ー ー 15 net.ListNetGUIDs NetGUIDのリスト一覧表示 ー ー 16 net.ListNetGUIDExports NetGUIDとエクスポート回数のリスト一覧表示 ー ー Float 0.25 Int32 0 net.MaxSharedShadowStateUpda 特定の接続で新しいCLが使用可能になっても指定時間が経過した場合は、強制的にす 17 teDelayInSeconds べてのプロパティを結合 18 net.MaxPlayersOverride 最大プレイヤー数の上書き指定 19 net.MaxRPCPerNetUpdate 1回の更新で許可されるRPCの最大数 Int32 2 20 net.MaxRepArraySize Replication情報の動的配列最大要素数指定 (element) Int32 2048 21 net.MaxRepArrayMemory Replication情報の動的配列最大サイズ指定 (Byte) Int32 65535 22 net.Montage.Debug AnimMontageに関するReplication情報のログ出力 Int32 0 23 net.OptimizedRemapping 最適化されたパスを使用してマッピングされていないネットワークGUIDのRemap Int32 1 Float 0.02 Int32 0 FString "" TArray <FString> ー 24 net.PackageMap.LongLoadThresh Objectのシリアライズのロードが長い時に警告を出力する時間 hold net.PackageMap.DebugAll すべてのオブジェクトのPackageMapシリアライズデバッグ 25 26 27 net.PackageMap.DebugObject Object指定でのPackageMapのシリアライズデバッグ 指定したObjectシリアライズ、またはReplication時にログ出力 net.Packagemap.FindNetGUID 指定されたNetGUIDに割り当てられたオブジェクトを検索して表示 指定あり/なしで表示が変わる #UE4Osaka Note 0:無効 1~:プレイヤー人数 0:出力なし 1:出力あり 0:無効 1:有効 指定なし:全て表示 指定あり:対象のみ表示
Network関連Console Command (3/3) # Command Description 28 net.PartialBunchReliableThreshold 部分的Bunchの高信頼性閾値 net.PingExcludeFrameTime Server-Client間のNICのRTT時間を計算 29 ACKデータに書き込まれる net.PingDisplayServerTime サーバーのフレーム時間を表示 30 LogNetTraffic/Warning時に有効 net.ProcessQueuedBunchesMillise Queに入れられたBunchを処理するための時間の閾値 31 condLimit 1つのフレームでこれより時間がかかる場合は、次のフレームまで待ってQueに入れら れたBunchの処理を続行 net.RandomizeSequence 初期パケットシーケンスのランダム化 32 33 34 35 36 net.Reliable.Debug 全てのReliable bunchログ出力 net.Replication.DebugProperty 名前によるプロパティのReplicateをデバッグ net.RelinkMappedReferences 再リンクマッピング参照 このオブジェクトを参照しているレプリケータをすべて検索し、参照をマップされて いないものとしてマークする 全てのRPC bunchログ出力 net.RPC.Debug 37 net.ShareShadowState 38 net.TestObjRefSerialize ネットワーク接続においてTick毎にすべてのOpen Channelをチェック (有効時はパフォーマンスが低下) net.UseAdaptiveNetUpdateFreque Replicate周期Actor依存設定 40 ncy 詳細はServerReplicateActors_BuildConsiderList 39 net.TickAllOpenChannels プロパティを比較する作業は接続間で共有される 全クライアントにオブジェクト参照をReplicateするテスト #UE4Osaka Type Default Int32 0 Int32 0 Int32 0 Int32 30 Int32 1 Int32 0 FString "" Int32 1 Int32 0 Int32 TArray <FString> 1 Note 0:無効 1:有効 0:出力なし 1:出力あり 0:無制限 0:無効 1:有効 0:出力なし 1:送信時のみ出力 2:更新時に出力 0:出力なし 1:出力あり ー Int32 0 Int32 1 0:無効 1:有効 0:1.0f固定 1:Actor依存
制約 • ホストマイグレーション – Listen Serverで接続時のHost移譲など • 複数セッションへの接続 – セッション接続中に別のセッションへの参加など • 異なるプラットフォーム間のOSS連動 – WindowsとiOSのネットワークコミュニケーションなど • その他... #UE4Osaka
まとめ • Engineの機能を把握した上で適切な設計を • BlueprintとC++で出来ることを把握して設計を • 特にオンラインマルチプレイ時には注意 #UE4Osaka
参考資料 UE4 MultiPlayer Online Deep Dive Slide • UE4 MultiPlayer Online Deep Dive 基礎編1 -Getting Started- https://www.slideshare.net/EpicGamesJapan/ue4-multiplayer-online-deep-dive-getting-started-ue4dd • UE4 MultiPlayer Online Deep Dive 基礎編2 -Traveling- https://www.slideshare.net/EpicGamesJapan/ue4-multiplayer-online-deep-dive-traveling-ue4dd • UE4 MultiPlayer Online Deep Dive 実践編1 https://www.slideshare.net/EpicGamesJapan/ue4-multiplayer-online-deep-dive-1-byking-ue4dd?next_slideshow=1 • UE4 MultiPlayer Online Deep Dive 実践編2 https://www.slideshare.net/EpicGamesJapan/ue4-multiplayer-online-deep-dive-2-ue4dd #UE4Osaka
参考資料 • UE4 Networking https://www.slideshare.net/JoeGraf1/ue4-networking?qid=bba12faf-ef8f-456d-9ecfee3656e4c3d9&v=&b=&from_search=1 • Multiplayer Network Compendium http://cedric-neukirchen.net/Downloads/Compendium/UE4_Network_Compendium_by_Cedric_eXi_Neukirchen.pdf #UE4Osaka