オンラインで同期した100体の巨大生物から
地球を衛る方法
ま~るい地球が四角くなった!? デジボク地球防衛軍 の場合
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
お品書き
• はじめに
• 巨大生物の同期方法(共通編)
• 巨大生物の同期方法(固有編)
• 巨大生物以外の同期について
• まとめ
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
はじめに
デジボク地球防衛軍とは
2020年12月24日にディースリー・パブリッシャー様から
発売された、地球防衛軍スピンオフタイトルです。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
はじめに
デジボク地球防衛軍とは
バラバラになった四角い地球を元に戻すために、
EDF隊員やオリジナルのキャラクターが奮闘します。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
はじめに
基本的な事柄
・エンジンバージョン
4.24.3をベースとしたカスタムエンジンを使用しています。
エンジン改造は最低限とし、ほぼベースのまま使用しています。
・オンライン対応
本タイトルではリッスン・サーバーを使用し、最大4人までの
オンラインマルチプレイに対応しています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
はじめに
本タイトルで目指したマルチプレイ
・巨大生物100体の同時出現と、オンライン同期
・プレイヤー4人で最大16体のキャラクターの同期
・協力プレイを前提とした、共闘感を出すこと
これらを実現するために攻撃や死亡といった状態変化は優先的に
同期するようにして、ヒットポイント等の内部的なパラメータは
同期しないか同期頻度、優先度をかなり下げていました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
はじめに
本タイトルで目指したマルチプレイ
またリッスン・サーバーを採用しているということもあり、
サーバーとなった端末の負担や待ち時間を軽減するため、
移動処理や攻撃の当たり判定、ダメージ計算などの処理は
クライアントの端末でそれぞれ行う様にしました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
はじめに
用語解説
・エネミー
巨大生物や怪獣などの敵キャラクターです。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
はじめに
用語解説
・ブラザー
プレイヤーの操作する人物キャラクターです。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
はじめに
用語解説
・ミッション
本タイトルにおけるゲームプレイパート
及びその単位を指します。
プレイヤーがブラザーを操作して
エネミーを倒す遊びの中核部分を、
ミッションと記載しています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
はじめに
用語解説
・RPC
本スライド内で単にRPCと記載されている場合は、
信頼性なしのRPCを指します。
・座標
座標は基本的にはLocation情報になります。
用途によってRotation情報を含む場合があります。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1. 座標の同期
2. ダメージの同期
3. 攻撃の同期
4. AI の同期
5. 撤退の同期
6. 特殊な演出の同期
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
最初は UE4 標準機能である Actor の Replicate Movement
オプションで座標の同期を行っていました。
作業用のレベルでは問題ありませんでしたが…
実際のゲーム用レベルでは座標のワープが多発しました。
エネミーが100体いる影響で同期する頻度が下がった為です。
その為、独自の同期処理を実装しました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
まず、エネミーの Root Component の座標とは別に
同期用の座標を作成し、レプリケートで同期するようにしました。
そして、各端末で同期用の座標に向かってRoot Componentを
移動する処理を実装しました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
この仕組によってエネミーが100体動いていても、
見た目上の大きな問題は発生しない様になりました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
1.サーバーから座標が送られてきます。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
2.そこに向かって移動します。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
3.再びサーバーから座標が送られてきます。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
4.そこに向かって移動します。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
同期した座標に移動させているのですが、移動速度は
一定ではなく、通信頻度から計算しました。
通信が安定しない環境では、受け取った座標が10m先の
場合もあれば、100m先の場合もあった為、一定速度では
座標が大きくずれる問題が起きました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
エネミーの数が減ると、通信頻度が上がります。
100体では0.3秒に1回程度でしたが、
エネミーが減っていくと0.1秒に1回程度になりました。
この変化を考慮して移動速度を計算しました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
同期する座標を受け取るまでに経過した時間をもとに、
移動速度を計算しました。
通信が大きく遅延すると、同期座標の更新が止まり、エネミーも
実際とは違う座標で停止してしまいました。
これを回避するため、移動速度も遅めに調整して、通信との
バランスを取る対応を行いました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
移動速度を求める式
(同期した座標 - Root Componentの座標) / 経過時間(秒)
移動速度を遅くするには、経過時間に+αします。
本タイトルでは様々な環境で検証した上で、α=0.3秒としました。
調整前は5割のエネミーが停止していましたが、調整後は2~3割程度に
改善しました。この頻度であればマルチプレイにおける共闘感を阻害しな
いと判断し、問題なしとしました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
1.座標の同期
エネミーの移動制御は自作の移動コンポーネントですので、
座標の同期による移動中は移動処理がスキップされるように
調整しました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
2.ダメージの同期
ダメージはサーバーで集計して、ヒットポイントの計算に
反映しています。
ダメージの送信は、RPC(信頼性あり)を使用しました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
2.ダメージの同期
ダメージは各クライアントで0.3秒に1回、まとめて
送るようにしました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
2.ダメージの同期
ヒットポイントは同期していません。
ダメージの計算はサーバーでやるため後述の死亡同期があれば
ヒットポイントを同期する必要は特にありません。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
サーバー クライアント
与えたダメージ
HP は渡さない
巨大生物の同期方法(共通編)
2.ダメージの同期
ヒットポイントが0になったときに死亡状態を同期します。
死亡は大切な状態遷移のため、RPC(信頼性あり)を使用します。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
サーバー クライアント
与えたダメージ
HP は渡さない
死亡は同期する
巨大生物の同期方法(共通編)
2.ダメージの同期
ダメージが発生した際に、エネミーのヒットリアクションは
同期していません。
※攻撃が当たった時のダメージ演出アニメーションや、
吹き飛ぶような演出をヒットリアクションと呼んでいます。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
2.ダメージの同期
ブラザーの攻撃は厳密な同期をしていません。
そのため、エネミーのヒットリアクションだけを同期すると、
攻撃が当たっていないのにリアクションだけ再生している様に
見えてしまうため、不自然な見た目になってしまいます。
ただし例外的に同期しているヒットリアクションがあります。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
2.ダメージの同期
よろめきアニメーションは同期しています。
このアニメーションには移動量があり、同期していないと
座標がずれてしまい不自然なスライド移動が発生します。
この問題は悪目立ちするため対応優先度が高く、通信には
RPC (信頼性あり) を使用しています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
3.攻撃の同期
エネミーの攻撃の同期は、エネミーが攻撃するタイミングで
行いました。
同期には RPC を使用しており、引数に攻撃の種類を渡して
います。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
3.攻撃の同期
しかしそれでも、クライアントで攻撃しない問題が
度々発生しました。
これは、エネミーの攻撃制御プログラムに
問題があった為でした。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
3.攻撃の同期
「ヒットリアクション中は攻撃しない」という攻撃制御が、
オンラインでは攻撃の RPC を受け取っても
攻撃できないという問題になってしまいました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
3.攻撃の同期
クライアントで攻撃の RPC を受け取ったら、
ヒットリアクションをキャンセルすることで回避しました。
それでも、通信環境によっては RPC のロストにより
攻撃しない事がありました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
3.攻撃の同期
怪獣などの超巨大なエネミーや、攻撃アニメーションの長い
エネミーは攻撃を RPC(信頼性あり)で送ることで、攻撃が各
端末で実行される様にしました。
その他のエネミーは攻撃が必ずしも同期していなくても見た目上
の大きな問題はなく、共闘感を削ぐものではなかったため不問と
しました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
4.AIの同期
エネミーの AI は、サーバーでしか動いていません。
サーバーの AI が決めた行動から、前述の座標や攻撃などの
制御ステートを同期することで、結果として行動も同期して
いる様に見せています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
5.撤退の同期
ミッション中に倒すことが出来ないエネミーが、ミッションの
進行にあわせて撤退する場合があります。
エネミーの撤退は、以下の流れで行われます。
1. 所定の位置まで移動する
2. 撤退アニメーション再生する
3. 再生後に死亡ステートに遷移する
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
5.撤退の同期
撤退の同期は特に凝ったことはしておらず、単純に
撤退アニメーション再生開始処理を RPC で同期しています。
もし撤退のRPCが届かなかったとしても、撤退後の
死亡状態の同期によって、エネミーは破棄されます。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(共通編)
6.特殊な演出の同期
ギサンダー(アリ)や、ツキサスピアン(ハチ)などがブラザーを
発見すると、目の色が変わります。
これはエネミーが攻撃状態かどうかを判断する基準となるため、
レプリケートで状態の同期を行いました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
1. ヘクトルの頭の開閉
2. ツキサスピアンの離着陸
3. シディロスの変形
4. ドラゴン・センチピードの生成
5. 四足歩行要塞のレーザー砲
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
1.ヘクトルの頭の開閉
ヘクトルというエネミーはブラザーを発見したら
頭が開閉するようになっています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
1.ヘクトルの頭の開閉
ヘクトルの頭は弱点となっており、開いている時に攻撃を
当てると大ダメージを与えることが出来ます。
その為、開閉状態のフラグをレプリケートで同期していました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
2.ツキサスピアンの離着陸
ツキサスピアン(ハチ)が地上にいるのか、空中にいるのかは
固有の方法で同期しています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
2.ツキサスピアンの離着陸
ツキサスピアン(ハチ)の離着陸のステート
・地上
・離陸直前
・離陸中
・飛行中
・着陸直前
・着陸中
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
2.ツキサスピアンの離着陸
離陸フロー
着陸フロー
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
地上 離陸直前 離陸中 飛行中
飛行中 着陸直前 着陸中 地上
巨大生物の同期方法(固有編)
2.ツキサスピアンの離着陸
同期用のステート変数を使った同期処理
1.同期用のステート変数を用意する。
2.サーバーはステート変数に値を入れ続ける。
3.クライアントは同期用のステート変数と
実際のステートを比較する。
ステートが違うなら、離着陸の処理を実行する。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
2.ツキサスピアンの離着陸
レプリケートではステートがスキップしてしまう事があります。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
地上 離陸直前 離陸中 飛行中
巨大生物の同期方法(固有編)
2.ツキサスピアンの離着陸
ツキサスピアン(ハチ)の離着陸のステート
・地上 地上系
・離陸直前 飛行系
・離陸中 飛行系
・飛行中 飛行系
・着陸直前 地上系
・着陸中 地上系
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
3.シディロスの変形
シディロスは落下形態から戦闘形態に変形します。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
3.シディロスの変形
シディロスの変形フロー
1.落下形態
2.変形アニメーション
3.落下形態を Destroy、戦闘形態のシディロスを Spawn
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
3.シディロスの変形
シディロスの変形フロー
1.落下形態
2.変形アニメーション
3.落下形態を Destroy、戦闘形態のシディロスを Spawn
2の、変形アニメーションを開始するタイミングだけを
同期していました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
4.ドラゴン・センチピードの生成
ドラゴン・センチピード(ムカデ)は節ごとに別々のエネミーに
なっており、全ての節をリストで連結しています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
4.ドラゴン・センチピードの生成
サーバーでは頭から尻尾までを順番に生成しています。
生成後にエネミーの基本情報をレプリケートで同期しているので
クライアントではエネミーとしての生成は順不同になってしまい
ました。
そのため、頭から尻尾までが揃うまで待つ必要がありました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
4.ドラゴン・センチピードの生成
順不同の生成を待つ方法
1.頭から尻尾までのエネミーを格納できる配列を用意し、
レプリケートを使って同期する。
2.クライアントでは配列を監視し、
全てのエネミーが生成できるまで待つ。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
4.ドラゴン・センチピードの生成
生成が遅延しているため、
ミッション開始直後に AI が動き出すと
クライアントは同期する事ができません。
ミッション開始直後は AI を動かさない事で対応しました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
5.四足歩行要塞のレーザー砲
四足のレーザー砲は独立したエネミーになっています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
5.四足歩行要塞のレーザー砲
レーザー砲はスポーンした後で本体にアタッチしていますが、
前述の通り、本体の生成が遅れてしまう事があります。
そのため、本体のポインタをレプリケートで同期して、
生成の完了を待っています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物の同期方法(固有編)
5.四足歩行要塞のレーザー砲
本体のポインタをレプリケートで同期しているため、
遅延が発生しアタッチ処理が遅れる事があります。
ミッション開始直後は四足に近づけないため、
この方法のままにしました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物以外の同期について
1. ブラザー・シスター
2. ビークル
3. ミッション進行
4. 防衛拠点
5. ドロップアイテム
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物以外の同期について
1.ブラザー・シスター
プレイヤーはブラザーを4体まで使うことが出来るので、
オンラインプレイでは最大16体のブラザーを同期しています。
プレイヤーが操作するキャラクターとなるため、操作上の
違和感などが発生しないよう、同期するステータスは
多くなりました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物以外の同期について
1.ブラザー・シスター
プレイヤーが操作しているので確実な同期が必要な要素が
多く、ステータスの同期にRPC(信頼性あり)を使用する
頻度はエネミーより多くなりました。
攻撃も入力の同期だけでは攻撃方向などがずれました。
事前計算した着弾の予測座標や、ロックオン対象なども
RPC(信頼性あり)を使用して同期していました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物以外の同期について
2.ビークル
ビークルもプレイヤーが操作するため、
RPC(信頼性あり)を使った同期が多くなりました。
ビークルは武器のリロードがなく、プレイヤー同士で乗り回す
ため、降車時に残弾数はRPC(信頼性あり)を使って同期して
いました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物以外の同期について
3.ミッション進行
ミッション進行は、セオリー通りの対応を行いました。
進行の判断や進行はサーバー側で行い、クライアント側に
スクリプトの実行をマルチキャストで送りました。
ミッションの進行は必ず同期しないといけないものですので、
ほぼRPC(信頼性あり)で通信しています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物以外の同期について
4.防衛拠点
防衛拠点とは、防衛対象となる建物のことです。
この建物のヒットポイントが0になるとミッション失敗です。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物以外の同期について
4.防衛拠点
防衛対象のヒットポイントは各プレイヤーの端末で
表示する重要な情報です。
が、多少ずれても大きな問題にはならず、ミッションの
進行はサーバーが判断していることもあって、
ヒットポイントはレプリケートによる同期にしました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物以外の同期について
5.ドロップアイテム
ドロップアイテムとは、エネミーを倒した際にドロップする
回復アイテムや配置済みアイテムを指します。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
巨大生物以外の同期について
5.ドロップアイテム
ドロップアイテムは生成時と取得時のみ同期しており、
座標など細かい同期は行っておりません。
生成するアイテムはランダム抽選となっており、
乱数のシード値のみを同期しています。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
まとめ
通信負荷が高い環境では同期用の変数を使用し、
状況に合わせてクライアントで制御することが効果的でした。
厳密な同期ができているかではなく、
目指すマルチプレイができているかが大切だと思いました。
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S
ご清聴ありがとうございました
©2003-2021 D3 PUBLISHER ©2003-2017 SANDLOT ©2019-2021 YUKE'S

オンラインで同期した100体の巨大生物から地球を衛る方法 UNREAL FEST EXTREME 2021 SUMMER