PUBGというゲームを知らなかったのでちょっと概要とかを見てみました。
まず確認したいのですが、あなたが作りたいのはどの要素ですか?
- 100人くらいがわちゃわちゃ戦うTPS
- それなりのグラフィックスできれいなTPS
- 生き残りをかけたTPS
まず要素的に上から順に難しいです。3vs3程度であれば生半可な知識でもそれなりに動ける通信対戦ゲームは作れますが、100人ともなると様々な要因がひっかかってきます。まずそれだけ膨大な人数の「コンマ数秒」の遅れすら許されない同期通信を捌ける、という条件が必要になります。
それなりのグラフィックスできれいなものにするにはモデルデータ等が必要になります。一番楽なのはそこらのMMDのモデルを組み込むことですが、単純に組み込むとそれが100人も居れば描画負荷は凄まじいことになります。とてもじゃないですが家庭用PCでは処理速度が追いつきません。
ただ単に何人かで集まって、バトルロイヤルなTPSが作りたいだけならそれらのハードルは下がります。
ではぱっと思いつく、ハードル高めな必要な技術について見てみましょう。
TCPやUDPといったソケット通信技術
TCP、UDPという通信プロトコルがあります。これはHTTP等の「通信したら返事が来る」といった一方的なプロトコルと違い、「通信しっぱなしでお互いがいつでも相手にデータを投げられる」という仕組みとなります。TCPは「投げたデータが確実に届くが、少し遅い」、UDPは「投げたデータが届くとは限らないがとても速い」通信です。これらを組み合わせて利用して、例えばプレイヤーの動きや誰がどこで誰にダメージを与えたか、などをサーバに送信、サーバ側はそれを集計して誰が倒れた等を全員に伝える、という流れになります。
多少のラグを吸収し、撃った側、撃たれた側の納得できる仕様を考える力
愚直に移動や弾丸の軌道を通信でやりとりしてサーバで当たり判定、ということをやるとおそらくいつまでたってもお互いに弾が当たりません。なぜなら撃った側の見ている世界、撃たれた側の見ている世界は必ずコンマ数秒のズレがあるからです。ということは撃った側、撃たれた側のどちらを優先するか?という考えになります。撃った側の見た世界を優先すると、撃たれた側は「壁に隠れたのに蜂の巣にされた!クソゲー!」となり、撃たれた側を優先すると「撃っても撃ってもダメージ入らん!クソゲー!」となります。これをお互いストレスを感じない程度に差を吸収できる仕様を考える力が必要です。
100人という膨大な人数の非同期な操作を統括して処理するサーバ処理
少人数のゲームであれば、多少力技の処理をサーバに書いても処理が間に合いますが、100人のデータを瞬時に計算して、100人全員に適切な情報を返さなければならないとなると、まず仕様の時点で軽量化を図る必要があります。サーバ側を軽量なアルゴリズムで仕様を満たすには、ある程度の「どんぶり勘定」であったり、「余分の削除」であったり、「ある程度クライアントに任せる」等も織り込む必要があります。これらのさじ加減は長年ゲーム企業が培った技術であり、専用の技術書が1万オーバーで売っているような世界です。
モデルのLOD(Level Of Detail)管理
きれいなモデルをそのまま動かしていると猛烈に処理速度が落ちます。遠いキャラのモデルはディティールを下げる、立ち止まっているときだけきれいに見せる、などの「ディティールの動的な変化」を実装する必要があります。
とりあえず私の知識で思いつくのはこのくらいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/26 09:01 編集
2017/10/26 09:19 編集
2017/10/27 07:08
2017/10/27 15:41
2017/10/29 18:07