質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • SQL

    2011questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • サーバ

    708questions

    サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

  • ゲーム開発

    152questions

  • UE4

    58questions

    UE4はUnreal Engine(アンリアルエンジン)の第4世代です。 UEは、Epic Gamesより開発されたゲームエンジンです。

  • Unreal Engine

    15questions

    Unreal Engineは、Epic Games社によって開発されたゲームエンジンです。高レベルの移植性を持っており、様々なプラットフォームのゲーム開発が可能。GitHubアカウントを登録すれば無料でダウンロードできます。

UE4でPUBGのようなゲームを作りたいのですがどういった技術が必要ですか?

解決済

回答 2

投稿

  • 評価
  • クリップ 3
  • VIEW 1,344

mello

score 41

PUBGのシステムをオマージュした作品を作りたいと思っており、
その為のモチベーションはかなり高く、2ヵ月前から、参考書を購入してUE4を独学して、ちょっとしたミニゲーム程度なら作れるようになったのですが、
PUBGを作る為に必要な技術の核心に迫った回答を得るべく、
本日、昼間にUE4に詳しい人に聞きに行ったら「クライアントのほかにサーバーの知識が必要」と言われて、掘り下げて聞いても具体性に欠ける回答しか得られず、
結局『どういう技術が必要でどういう勉強法を取るのが効率的か』という肝心な事は聞けずじまいでした。

サーバーの知識といっても多肢に渡ると思います。
サーバーは、AMAZONのクラウドサービスを利用するのが良いというように聞きましたが、
それは、正しい判断でしょうか?

最終的な目標としては賢者になる事でもなんでもなく、
PUBGと同じようなゲームを作る事なので、
その為には、どういう技術を身につければよいか、またどういう勉強法を取ればよいか、
何かいいアドバイスを頂けませんか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

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 18:01 編集

    回答ありがとうございます。

    私が作ろうとしているゲームで、
    『PUBGと同じシステム』の部分は・・・
    ・100人のユーザーが約10平方kmのフィールド上に大体均等に散布されて戦う
    ・戦闘前の各ユーザーの違いはニックネームとアバターのみ。全員がフェアな状態で戦う
    ・フィールド上には毎回ランダムで装備やアイテムがバラまかれる
    ・時間の進行と共に、フィールド上の活動可能範囲が縮小していく(これにより殺し合いで少なくなったユーザー同士が必然的に同じ場所で戦うことになる)
    ・TPS / FPS は任意で切替可能
    ・装備品はアバターとは別に外見に反映される

    ざっとこんな物です。


    『サーバーが処理する静的な情報』
    ・ユーザーネーム
    ・アバター
    (これぐらい?)

    『サーバーが処理する動的な情報』
    ・100人のユーザーの動的パラメータ(生死・HP・残弾数・装備耐久値など)
    ・フィールド上のアイテム⇔ユーザーが所有するアイテム / ユーザーの現在の装備
    ・100人のユーザーの位置・向き・モーション

    『ヒットの同期提案』
    「ヒット判定は攻撃側で行い、ダメージ計算は被撃側で行い、値の反映をサーバーで行う」
    といったP2Pとサーバー方式を組み合わせた方式でいこうと思うのですが、以下のようなフローチャートは現実的に実装できそうでしょうか?

    ①クライアントAさんサイド
    『クライアントBさんに対して弾を撃った』
    ー 外れた  → 何も送信しない
    ー 当たった → クライアントBさんへ送信 [TCP]『当てた部位・使用武器・距離』

    ②クライアントBさんサイド
    クライアントAさんから受信した情報(部位・武器・距離)と自分が装備している防具の情報を基にダメージ計算を行い、結果をサーバーに送信する。

    ③サーバーサイド
    クライアントBさんから受け取った結果(HP・防具耐久値・生死など)の情報を更新し、他のユーザーに TCP で返す処理を行う。

    以上のようなやり取りで問題なさそうでしょうか?

    ===

    ほかにも幾つか質問があります。

    1つ目は、
    TCPとUDPはどういう基準で分ければ良いでしょうか?
    高速化の為にUDPも織り交ぜたいところなのですが、一つとして確実性に欠けて良い情報がないような気がしています。

    2つ目は、
    100人1ゲームを幾つも用意したり、国別でサーバーを分けたりといった、恐らくサーバーサイドの処理になるであろう部分は、どういう風に実装したらいいですか?
    サーバーの実装や運営をした事がないので、どういう言語を使うのかとか、どういうエンジンで動作するのかとか殆どわかっていません。

    キャンセル

  • 2017/10/26 18:19 編集

    ヒットの同期提案はそれで概ね成立すると思います。まずはそれで作ってみて、問題が起きたらそこの仕組みを変える、というスタイルのほうがよいと思います。
    TCP、UDPの使い分けは例えば移動に関して「1秒ごとに確実にTCPで座標を送り、それ以外はUDPでできるだけリアルタイムな座標を送る」といった使い分けをしたりします。
    サーバの負荷分散は国別でサーバを分けるほど盛況になったときに考えるべきかと思います。最初からスケーラビリティを考えておくことは重要ですが、個人レベルで作るもので世界中から猛烈なアクセスが来ることを考えるのは取らぬ狸の皮算用です。というか、私もさすがにそこまで大規模なことをやったことがないので、アドバイスも難しいです。AWSで考えれば「人が混んできたらCPUパワーが上がる」ような組み方をすれば、小規模なアクセスであればそれだけで捌けるかと思います。

    キャンセル

  • 2017/10/27 16:08

    返信ありがとうございます。
    言われてみれば、その使い分けに思い当たる挙動は既成のオンラインFPSでも見られたような気がします。

    PUBGはレトロゲームのボンバーマンにおける対戦が終盤に差し掛かるにつれ、ステージが端から収縮していくというシステムを現代的な形で転用し、再燃させ大流行させた、厳密に言えばパクリですが、開拓的で未完成のジャンルだと思っています。

    現状1つオリジナルの実質パクリのようなFortniteというタイトルを知っていますが、
    作品としてはやや上位互換ですが決定打に欠ける為、その勢いはオリジナルの足元にも及びません。

    私が思うに何か決定打となるエッセンスを足した上で、
    上位互換+α の物を出せば、まだ参入の余地があると思っています。

    そのタイミングも恐らく今しかないので、趣味の範疇ではなく、本気で仕事にするつもりでスケーラビリティも考えており、開発に向けて急いで技術を身に着けようと思っているのですが、

    今の話を聞くと、通信の最適化の部分で躓いて、
    参入のタイミングを逃す恐れがありそうな気がしています。

    こういうのを学習する時に最も効率的な手段はなんでしょうか?

    ちなみにUE4を勉強する時にC++も一緒に勉強したので、少しコードを読める程度の知識はあります。

    キャンセル

  • 2017/10/28 00:41

    プロトタイピングで早々に動くものを作り、そこからブラッシュアップするのが近道かつ確実に完成へ近付くものかと思います。「改善しなければいけない」という環境に追い込むことが「嫌でも技術がつく」ことに繋がります。ただ漠然と勉強するより、よほど効果的かと思います。私が技術を身に着けたのも漠然と本を選んで読んだからではなく「必要に迫られたので学習した」結果です。

    とりあえずいきなり100人でなく、数人で動かせるものを作り、そこから改善していく形でやるのが一番実践的かつブートキャンプ的な早さで学習できるかと思います。100人でも2人でも、TCP等の通信を使うことには変わりなく、あとはそこからのアルゴリズムや仕様が変わるだけです。

    キャンセル

  • 2017/10/30 03:07

    なるほど…、わかりました。

    とりあえずは動く物を作ってみようと思います。

    キャンセル

0

ざっくりというと、ゲーム全体としては3D技術を理解するための数学の基礎及び応用知識、ゲームフレームワーク基盤で3DのFPSを実現する事(C++やC#)と、それに表示する3Dモデル、テクスチャ等のグラフィック素材の調達と、ネットワーク対戦ゲームとしてリアルタイム通信を行うサーバーが必要になります。
製品として真面目に作ると何千万円、何億円という予算が必要ですが、趣味やインディーズゲームとしてであれば出来上がりのものをうまく組み合わせることでバトルロワイヤル的な乱戦ゲームはそこそこのものが実現できると思います。
Photonというネットワークゲーム用のサーバーサービスが定期的にハンズオンを開催しているので、その他UnityやUE4等のセミナーや勉強会と合わせて参加してみると感覚がつかめると思います。
Photon
AmazonのAWSも最近はゲームサーバーやゲーム用のフレームワークにも力を入れているので、コストや作りやすさを一通り比較してみると良いかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    ゲーム開発について

    ゲーム開発の実績が無い企業でゲーム開発を任されましたが、一体何から初めれば良いのかわかりません。 詳しく解説が行われているサイト等ご存知でしたら教えて頂きたいです。 ちなみに私

  • 解決済

    スマホアプリ配信にはサーバーが必須ですか?

    例えばゲームとかはどうですか?ランキング機能付きのゲームは必須だと思うのですが...ゲームでなくてもメモ帳などのデータを保存する系はどうなんですか?AndroidならSQLiteを

  • 解決済

    Flex4の特徴

    設問A Flex4は,ブラウザを更新しなくても,リアルタイムに更新される機能がありますでしょうか? 設問B Flex4が得意な事,苦手な事を教えてください。 設問C 次のようなシス

  • 解決済

    対戦型カードゲームを作りたいです【ゲーム開発】

    こんにちは。ゲームプログラミングに興味があるmassu1221と申します。 この度、以下のことをお伺いしたく質問させて頂きました。 わからないこと・解決したいこと 「

  • 解決済

    awsのクラウドGPUについて

    https://aws.amazon.com/jp/about-aws/whats-new/2016/09/introducing-amazon-ec2-p2-instances-

  • 解決済

    TwitterのAPI制限(Rate Limit Exceeded)

    前提 Twitter上でカードゲーム(髑髏と薔薇)をしようとしている者です。 DMで指令を出し、TL上に結果が表示されるようにしたいのですが、 DMが一瞬で制限に引っかかって

  • 解決済

    gitにおけるpushとcommitの違いについて

    はじめまして。 集中バージョン管理システムでしか開発をしたことがないのですが、 gitにおけるコミットとプッシュの違いがイマイチ理解できません。 ご存知の方いましたらご教授ください

  • 解決済

    スマホゲーム開発を考えています。cocos2dx unity どちらを選択するべきかご意見をお聞かせ...

    スマホゲーム開発を検討しております。 学習環境についてcocos2dxを選択するべきかunityを選択するべきか迷っており ご意見をお聞かせいただけないでしょうか? よろしくおねが

同じタグがついた質問を見る

  • SQL

    2011questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • サーバ

    708questions

    サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

  • ゲーム開発

    152questions

  • UE4

    58questions

    UE4はUnreal Engine(アンリアルエンジン)の第4世代です。 UEは、Epic Gamesより開発されたゲームエンジンです。

  • Unreal Engine

    15questions

    Unreal Engineは、Epic Games社によって開発されたゲームエンジンです。高レベルの移植性を持っており、様々なプラットフォームのゲーム開発が可能。GitHubアカウントを登録すれば無料でダウンロードできます。