マルチプレイヤーによるゲームを作成する際、サーバ側とクライアント側に、コードやブループリントを分散する必要があると思います。
その時、描画に関するものはクライアント側で、演算処理などの動作はサーバ側で、など、ある程度どちらで処理を行うかを選択するケースがあると思います。
そもそも、マルチプレイヤーの場合は、マッチメイキングの必要があったり、プレイヤーの接続が途切れた場合に復活したり、などのために、サーバ側でデータベースに接続したり、などの動作が必要になってくると思います(デバイスをまたいで同じユーザが、自分のデータを引き継いだり)
その場合、サーバ側のオペレーションを、すべてUnreal Engineで行うのではなく、サーバ側の処理は、Node.js、Pythonなどを使用した、より一般的なWEBサーバとして作成して、クライアント側のみUnreal Engineで作成する、などの作成方法は、あり得るのでしょうか?
それとも、サーバ側でもUnrea Engineのサーバインスタンスを走らせるのが一般的なのでしょうか?
おっしゃったとおり実際のゲーム製作環境になると処理負荷の問題等のせいでコードを分散する必要がありますし、そのサーバーの処理に使用できるのは色々あります。
ただし、実際のゲーム製作環境だとゲームプレイに関する処理は大体UEの方に記載します。
・ サーバーでも物理挙動に関するエンジンの計算等が必要
→ ゲームはハッカーとかの対策が必要です。不法ツールを使いゲームでインチキをするような行為を防ぐためにはクライアントとサーバーが同じデーターをベースにお互いの計算の信頼性を確認する必要があったりします。
・ TCP/UDP処理の高い信頼性をUEのエンジン側で支援してくれる
→ ゲームは基本的には早いレスポンスが要求されます。なのでUEで提供しているエンジンはこのようなサーバークライアントの接続になるべく負荷がかからないようにデーターを管理したりします。
・作業のコスパ的にも一つのツールでまとまるのがよりいい
→ 複数のツールを利用するより、一つのツールでサーバーとクライアントの処理をちゃんと分ければより作業が進みやすいです。
→ サーバーとクライアントでお互い必要な部分だけコードを進めるように分ければ処理負荷的な面でも大きく問題にはなりません。
その以外にも色々と理由がありますが、UEでサーバーとクライアントの処理を一緒に組むのが一般的だと思います。(インゲームに限ります。)
一般的なゲームの流れは
・データーベースはS3みたいなクラウドデータセンター(AWSみたいな)を利用しデーターを管理し、長期間保存が必要なデーターを保存させる。
→ こちらみたいなアウトゲームの部分に関しては会社によって方法も色々あると思います。
→ ゲームのログインやゲームサーバーからのデータの入手などに使います。
→ WEBサーバーとして作成するよりはデーターベースからの情報を直接持ってきてゲームの中に伝えるような形ですね。
・実際のゲームをプレイするのに必要な情報に関してはUEを使ってDedicated Serverを立てるか、プレイヤーの誰かがHostになるHost Serverを立てるって感じです。
→ Host Serverの場合Hostになるプレイヤーのプレイ機器のスペックにサーバー参加者全員が左右されるのでDedicated Server方式が増えている感じです。
→ DedicatedServerはUEにサーバーの内容も作成し、それをServerとしてパッケージを作成、そのファイルをCloud Serverや、実際の会社のサーバー等で実行するような形です。なので、サーバー側でもUnreal Engineのサーバーインスタンスを走らせるのが一般的な使用方法となります。
具体的な部分でいくつか違いがあるかもしれませんが、このような流れだなとご了承いただければ幸いです。
丁寧なご説明ありがとうございます。
やはりサーバ側もUnrealで組むのが一般的なのですね。
Dedicated Serverを使って、例えばマルチプレイヤーのフィールド(ルーム)を複数作成したい場合(1on1の部屋を4つ作りたい、など)、server側でいくつかホストのインスタンスを並列に作成するようなイメージでしょうか?そのあたりはUnrealが面倒見てくれるのでしょうか?
どのプレイヤーがどのプレイヤーと対戦しているか、などの管理をどの部分でやるのか、まだイメージできていません。
数は増えますが、DedicatedServerではグラフィック関連処理が行われないため、処理負荷的には複数存在しても大丈夫って感じです。
でもこちらはUnrealですべて面倒を見てくれるのではなく、あくまでもUnrealを使ってほしいタイプにコードを組む必要があります。
この部分に関してはゲームやゲーム会社によっても異なりますのではっきりと言い切れませんね。
どのプレイヤーがどのプレイヤーと対戦しているか、などの管理をどの部分でやるのか
実際のゲームではなく、その他の情報を管理するためのアウトゲームのサーバーって感じです。
もう少しイメージしやすくするため、ネットワークアーキテクチャを添付致します。
添付の部分を見て頂けるとType AからType Dがありますが、こんないろんな方法の中で開発中のゲームに似合う方法で作成すると考えてください。
不十分な答えかもしれませんが、細かく伝えるには本当にい膨大な内容になってしまうため、ご了承ください。
ご返信ありがとうございます。
とても勉強になります。
この図で言うmanager serverは、unrealではなく、各制作会社によって適当な環境で構築されるということですよね。
また、どのクライアントが、どのdedicated serverに接続するかはmanager serverが判断して、portなどで振り分けるイメージでしょうか?
その際、それぞれのmanager serverをrunするときに、portを指定しておく、ということになりますか?
少し本コースの趣旨から離れた質問かも知れませんが、実際にゲームを制作してデプロイするまでの過程を想像したときに気になったので質問させていただきました。
port番号を特に指定する必要がございません。port番号はゲーム用に決められている物一つだけを使うのが基本です。
プレイヤーのデータにプレイヤーそれぞれのUnique Keyを持っていますので、
manager serverでマッチをする際にゲームルームの固有番号と参加するプレイヤーの固有番号をdedicated server(Listen Server)に送って、
それを受け取ったサーバーから必要な処理を行った上で、各クライアントにマッチ成功の情報をレプリケートするって感じです。
ありがとうございます。
例えば、こちらで紹介されているように
https://aws.amazon.com/blogs/gametech/compiling-unreal-engine-5-dedicated-servers-for-aws-graviton-ec2-instances/
dedicated serverを走らせた場合、作りたい部屋の数だけ同じEC2インスタンスが必要ということになりますか?(それぞれ固有のIPアドレスを有していて)
またその場合、クライアントを起動する時にはどのdesicated serverに接続するかが決まっておらず、manager serverからのマッチメイキングの返答を待ってからクライアントを起動することになりますか?
すみません、そのあたりの一連の流れがまったく想像できていません。
いいえ、まずEC2に関しては詳しくないので内容に違いがあるかもしれません。ご了承ください。(多分EC2はまた別の物だと思います。)
サーバーを立てるってことはサーバーのパソコンからサーバーのゲーム部屋を立てる事だとイメージしてください。
サーバーパソコンで色んなゲーム部屋を構築し、そこにクライアントが参加します。
ただし、これが一つのパソコンに多数のプレイヤーが集まると当たりまえですが、パソコンなので重くなるしラグが発生したりしますよね。
それがいわゆるサーバーラグですね。
なのでこのような検証を回避するために複数をサーバーパソコンを使って、負荷を軽減するようにしています。
もちろんこの部分に関しては会社によって異なりますが、イメージ的には添付画像みたいな感じです。
AmazonのEC2インスタンスはここでお話したサーバーパソコンに似たようなものかなと思われますが、明確な部分ではありませんのでご理解お願いいたします。