Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ゆるゆるUE4ネットワーク入門

666 views

Published on

第7回UE4勉強会の資料です

Published in: Engineering
  • Be the first to comment

ゆるゆるUE4ネットワーク入門

  1. 1. ゆるゆるUE4ネットワーク入 門 第7回UE4勉強会 IN 大阪
  2. 2. 自己紹介 名前:Chief Twitter @LSDGO 職種:プログラマー 活動 IM4Uを4.16から4.18に移植したり(バグあり) 京都で学生やってます。 最近格ゲーにはまり始めました。
  3. 3. こんな人へ マルチプレイヤーゲームを制作したいと思っている方 UE4初心者
  4. 4. 必要なもの • UE4が動くPC 1台 • 外へ繋がるネット • UnrealEngine4.20
  5. 5. とりあえずテンプレートから, プロジェクトを作成します。 ここではThird Person Templateで作っています Let’s 実装
  6. 6. かんたんマルチプレイヤー対応 次にキャラクターのブループリントを開き Class DefaultのReplicationの欄へ飛 び Replicatesのチェックが付いているか確 認します ※Third Person Templateの場合は最初から付いています
  7. 7. 赤枠で囲ってあるところを2にして プレイを押すだけ!
  8. 8. • 動画
  9. 9. ね、簡単でしょう?
  10. 10. ちなみにさっきのReplicatesのチェックが最初からついているのは CharacterとPawnのみ(おそらく)なのでActor等の場合はついている かチェックしましょう
  11. 11. ~球を作る~ Actorを継承したSphereを作ります。 Replicates のチェックは忘れず あとこの場合はSimulatePhysicsも!
  12. 12. 作ったACTORを配置して実行してみましょう • 動画
  13. 13. あれ?球の動きが同期していないんじゃ… Q:はい されていません。
  14. 14. Actorの場合はReplicate Movementの項目にチェックが入っていませ ん このReplicate Movementのチェックをつけないと Actorの位置と動きが共有されないので気を付けてくださ い Replicated Movementはデータの圧縮設定です。 サーバー側とクライアント側で位置が違うということになれば ここを変更します。 ~なぜか~
  15. 15. Replicate Movementにチェックを入れた場合 動画
  16. 16. ~ちなみに空のアクターから作る場合~ Rootが“DefaultSceneRoot”だったり当たり判定のない物だったりすると Replicate Movement にチェックが入ってない状態のようになります Rootは当たり判定のあるものにしたほうが無難だと思います
  17. 17. なぜDefaultSceneRootや当たり判定のない物だと動かないか DefaultSceneRootにコリジョンがついていない状態で子側で判定していると そもそもちゃんとブロックコリジョンが働かない可能性があります。 あとはコンポネーネントのレプリケーションの設定によってはズレる可能性も。 Alweiさんに聞きました。
  18. 18. とりあえず、これをするだけで動きます。(大体のものは) ただ、処理は別です。 マルチプレイに対応させるために様々な事をする必要があります。
  19. 19. マルチプレイ化するために 基本的に処理はカスタムイベントを使って細分化する必要があります。 こんな感じ
  20. 20. なぜ細分化しなきゃいけないのか カスタムイベントにもレプリケート機能があり、設定しなければサーバー で処理が実行されず、ActorのReplicate Movementにチェックを入れ てない時の如く、サーバー側とクライアント側の情報がずれるからです。 サーバー false クライアント false サーバー false クライアント true レプリケートされていない 処理を実行
  21. 21. カスタムイベントのReplicateは以下の4つがあります • Not Replicated • Multicast • Run on Server • Run on Owning Client
  22. 22. NOT REPLICATED カスタムイベントのデフォルトモードです。 クライアント側で動かせばクライアント側だけで サーバー側で動かせばサーバー側だけで実行されます。 ノットレプリケイテッド サーバー false クライアント false サーバー false クライアント true ノットレプリケイテッドの場合
  23. 23. MULTICA ST マルチキャストイベントがサーバー側で呼び出された場合のみ、接続して いるクライアントすべてで実行されます。 また、クライアント側で呼び出された場合は、サーバー側では実行されず、 呼び出し元のクライアント側のみで実行されます。 マルチキャスト サーバー false クライアント false サーバー true クライアント true マルチキャストの場合
  24. 24. RUN ON SERVER このイベントがサーバーから呼び出された場合は、イベントはサーバーのみ で実行されます。クライアントが所有するターゲットと一緒にイベントがクライ アントから呼び出されると、イベントはサーバーで実行されます。 ラン オン サーバー サーバー false クライアント false サーバー true クライアント false ランオンサーバーの場合
  25. 25. RUN ON OWNING CLIENT サーバーから呼び出されると、このイベントはターゲット アクタを所有するク ライアントで実行されます。サーバーはアクタそのものを所有するので、“Run on Owning Client” イベントは (名前の意に反して) 実際はサーバー上で 実行されます。クライアントから呼び出された場合、イベントは複製されてい ないかのように扱われて、呼び出し元のクライアントのみで実行されます。 ラン オン オウンニング クライアント サーバー false クライアント false サーバー false クライアント true ランオンオウニングクライアントの場合
  26. 26. Hello は 呼び出したクライアントのみ で見ることが可能です HelloGuy は サーバーのみで見ることが可能です HelloGuysは接続しているクライアントすべて (サーバー含む)で見ることが可能です Print Stringを使っ た例 普通に呼び出すとクライアント側のみで実行されます。 なので、後述
  27. 27. Print Stringを使っ た例 MULTICASTは普通に呼び出すとクライアント側のみで実行されます。 なので、RUNONSERVERを経由して呼ぶ必要があります。
  28. 28. RELIABILITY (信頼性) Unreliable イベントは名前が示す通りの機能を持ちます。イベントが目的地へ到達しな い可能性があります。しなかった場合そのイベントは実行されないはずです。 結果として、Unreliable イベントはReliable イベントよりも少ない帯域幅を使用し、より 頻繁に安全に呼び出せます。 レライアビリティ レプリケートしたイベントは、Reliable または Unreliable のどちらかに設 定できます。 Replicatedの下にReliableのチェックボックスがあります。 Reliable イベントは目的地への到達が保証されているイベントですが、条件 を満たすために多くの帯域幅を使用、およびレイテンシーが大きくなる可能 性があります。内部でオーバーフローした場合切断されます。
  29. 29. レプリケート設定の見やすい表 Not replicated Multicast Run on Server Run on Owning Client クライアントが所有権 を持っている サーバーで実行 サーバーとすべてのク ライアントで実行 サーバーで実行 ターゲットが所有する クライアントで実行 サーバーが所有権を 持っている サーバーで実行 サーバーとすべてのク ライアントで実行 サーバーで実行 サーバーで実行 不明な何かが所有権 を持っている サーバーで実行 サーバーとすべてのク ライアントで実行 サーバーで実行 サーバーで実行
  30. 30. 所有権 基本的にアクターはサーバー上でスポーンします。 そのためサーバーがアクターの所有権を持っています 例外的にクライアント上でアクターがスポーンした場合、 クライアント側がアクターの所有権を持ちます この場合のアクターはレプリケートされないため 基本的にサーバー側でスポーンさせます。
  31. 31. Switch Has Authorityというマクロで簡単に所有権で処理を分けれま す Authority で サーバー側でスポーンしたアクター Remote で クライアント側でスポーンしたアクター といった感じで分けれます。
  32. 32. イベントがレプリケートできるんだから変数はできないの? Q:できます。
  33. 33. 変数のレプリケーション レプリケーションには3つのオプションがあります。 • None • Replicated • RepNotify
  34. 34. NONE 説明するほどでもないですが何もしません。 尚変数の値を変えた場合、クライアント側は何も変わらず、サーバー側のみ変わります サーバー false クライアント false サーバー true クライアント false Noneの場合
  35. 35. REPLICATED • サーバーがアクターをレプリケート(複製)すると変数がクライアントへ送信 されます。 • 受け取るクライアントの値は自動的に更新されます。 • レプリケートされた値はサーバーからクライアントへの一方通行です。 レプリケーテッド サーバー false クライアント false サーバー true クライアント true Replicatedの場合
  36. 36. REPNOTIFY • 変数は レプリケーテッドオプションと同様にレプリケートしますが、 OnRep_<variable name> 関数はブループリントで作成します。 • この関数は、この変数の値が変更されるたびに、エンジンによってクライアント およびサーバー上に自動的に呼び出されます。 • この関数はゲームの必要に応じて、自由に実装することができます。 サーバー false クライアント false サーバー true クライアント true REPNOTIFYの場合 ついでに関数を実行!
  37. 37. 複数のPCでマルチテストする場合
  38. 38. こんな感じのブループリントを作ります。 OpenLevelの▼を押してOptionsを出して そこに”listen”を入力してください。 これがないと他のPCなどから入れません
  39. 39. Execute Console Commandのopen 127.0.0.1の 127.0.0.1は任意のIPにしてください。 このExecute Console Commandを実行す ることでサーバーへ参加できます。
  40. 40. UE4のサーバー機能には以下の 二つのモードがあります ・DEDICATED SERVER ・LISTEN SERVER
  41. 41. サーバー ユーザー ユーザー ユーザー ユーザー Dedicated Server サーバーがゲーム本体と違うソフトになっています。 利点はサーバーPCとゲームをプレイするPCを分けれることです。 イメージとしてはスマホゲーでサーバーに接続する感じ。 デディケイテッド サーバー
  42. 42. プレイヤー プレイヤー プレイヤープレイヤー Listen Server 超大雑把に言うと、Dedicated Serverとは違い、ゲーム本体をサー バーにして自らそれに参加できます 利点はゲーム本体以外のソフトを起動 しなくてもいいことです リッスン サーバー
  43. 43. またサーバーのレベルが遷移する際は 例:Level1からLevel2へ ServerTravelがあります。 LevelNameの部分は任意のレベルの名前を入力してください
  44. 44. GAMEINSTANCEなどなど … これに関しては結構ややこしいので MultiplayerShootoutやShooterGameを参考にすることをお勧め します。
  45. 45. GAMEINSTAN CE GameInstance はエンジンのセッション中のみ存在します。つまり、エンジンが起動 すると作成され、エンジンの電源を落とすまで破壊もしくは差し替えは行われません。 サーバーと各クライアント上には別の GameInstance が存在しています。 これらのインスタンスはお互いに通信しません。GameInstance はゲーム セッショ ンの間以外も存在し、レベルのロード中に存在し続ける唯一のゲームの仕組みです。 プレイヤーのライフタイム統計情報 (勝利者数)、アカウント情報 (特定アイテムの Locked/Unlocked のステータス)など、競争するゲームのマップをいろいろと回っ て歩く種類の永続データを格納するのに適した場所です。
  46. 46. GAMEMOD E GameMode オブジェクトはサーバーのみに存在します。 通常、クライアントが明示的に知る必要のないゲーム関連情報を格納します。 例えば、ゲームに "rocket launchers only (ロケットランチャーのみ)" とい う特別のルールがあったとしても、クライアントはこのルールを知る必要はあ りません。しかし、マップ周辺で武器を無作為にスポーンする時にサーバー は "rocket launcher" カテゴリからのみ選択することを知る必要があります。 MultiplayerShootoutではGamemodeにPlayerをスポーンさせる処理があ ります。
  47. 47. GAMESTA TE GameState はサーバーとクライアントの両方に存在します。 そのためサーバーはGameState でレプリケートした変数を使用して、ゲー ム関連のデータ上で全てのクライアントを最新に保つことができます。すべて のプレイヤーおよび観戦者に関係しても、ある特定のプレイヤー対して関連 性がないタイプの情報は GameState のレプリケーションに理想的です。 例えば、野球ゲームは各チームのスコアと現在のイニング(攻撃か守備)を GameState を使ってレプリケートします。 ShooterGameでは、チームの人数、残り時間、チームスコアが入っています。
  48. 48. PLAYERSTATE PlayerState は、ゲームと接続しているすべてのプレイヤーに対してサー バーとクライアント両方に存在します。このクラスは、プレイヤーごとの現在 のスコアなど、所有しているクライアントだけでなく、すべてのクライアントに 関係するレプリケート プロパティに使用することができます。 PlayerController と同様に、個々のポーンと関連づいていますが、ポーン が破壊またはリスポーンされても影響は受けません。 MultiplayerShootoutではここで個々のプレイヤーのスコアの管理とプレイヤーIDを管理してい ます
  49. 49. PLAYERCONTROLLER そのマシン上の 1 プレイヤーにつき、各クライアントに PlayerController が 1 つ存在しま す。これらはサーバーとサーバーに関連づいているクライアントの間でレプリケートされ、他 のクライアントに対してはレプリケートされません。その結果、サーバーは各プレイヤーに対 して PlayerControllers を持ちますが、ローカル クライアントはそれぞれのローカル プレイ ヤーの PlayerControllers しか所有しません。PlayerControllers はクライアントの接続 中は存在し、ポーンと関連づいています。ただし、ポーンが頻繁に破壊やリスポーンされても PlayerControllers は影響を受けません。そのプレイヤーだけが探知するゲーム イベント に反応してサーバーがクライアントにミニマップにピンするように伝えるなど、他のクライアン トにはこの情報の差し替えを行わずにクライアントとサーバー間でやりとりする場合にとても 適しています。 MultiplayerShootoutではPlayerControllerでUIを作成しています。
  50. 50. 参考にした資料 • C++コードはいらない!UE4で作るお手軽マルチプレイ ネットワークゲームについて • https://www.slideshare.net/masahikonakamura5 0/cue4 • ネットワークの構築とマルチプレイヤー • https://api.unrealengine.com/JPN/Gameplay/Net working/ 配布されているプロジェクト • MultiplayerShootout(UE4.19 to UE4.20)
  51. 51. ご清聴ありがとうございました!

×