マッチメイキング
以下は、Artūras Šlajus(arturaz)とErick Passos(erickpassos)との会話の抜粋です。
arturaz
@erickpassos マッチメイキングに興味がある場合は、PUN(Photon Unity Networking)かリアルタイムのドキュメントのどちらを調べるべきですか?
プレイヤーのキューを作成し、キューにX人のプレイヤーがいるときに特定のマップでルームを開始し、自動的にゲームを開始したいのですが。
erickpassos
チームベースのマッチメイキングには、外部ソリューションを選ぶべきです。
arturaz
Photon以外のものですか?
erickpassos
Quantumを開始する前に、Photonルームでいろいろなことができます。
待機キューなどはルーム以前に行われるものですが。
はい、Photon以外のものです。
ウェブサービスベースのものを考えて、以下のようなことを行います:
- マッチメイキングのために登録する(フィルターも使用);
- 応答を待つ;
- 応答 = region+room_name
- CreateOrJoin(that)
これは、Photonが行うルームベースのマッチメイキングの範囲外となります。
特段大きな理由としては、マッチメイキングは良いプレイヤー体験を提供するための鍵であり、ゲームのコアバリューであり、各パブリッシャーやスタジオは自身の分析手法を秘密厳守としてお取り扱っています。
Photonでルームフィルタリング(クライアントベース)を使ういくつかのトリックはできますが、リッチなキューを持つカスタムのチームベースのものほど良くなることはありません。
arturaz
以前、サーバープラグインについて話しましたが、それに関する情報が見つかりません。説明していただけますか?
erickpassos
Photonプラグインについての一般的な情報は、こちらを参照してください:
https://doc.photonengine.com/en-us/onpremise/current/plugins/manual
Photon Plugins Manual | Photon Engine
リアルタイムゲームおよびアプリケーションのための再配布可能なクロスプラットフォームマルチプレイヤーゲームバックエンドです。Android、iOS、.NET、Mac OS、Unity 3D、Windows、Unreal Engine、HTML5 などのSDKを使用して権限のあるロジックを開発します。
Quantumプラグインは、私たちが作成した特別なPhotonサーバープラグインです。
arturaz
ここにマッチメイキングを組み込めますか?
erickpassos
Quantumプラグインは、通常のPhotonプラグインとしてさらに拡張でき、Quantum特有のコールバックも利用できます。
1.2.1では、サーバーサイドやシミュレーションなどを含むサンプルのカスタムプラグインを提供します。
いいえ、プラグインとはルームが既に存在することを意味します。
そして、マッチメイキングはその前に決定する必要があるものです。
ルーム = マッチ
arturaz
わかりました。ですが、マッチメイキングを外部で行ったら、Photonでルームを作成できないのでは?
erickpassos
フィルターベースのマッチメイキングには、プラグインに特別なものは必要ありません。
クライアント側で実行されます。
いいえ、ルームは最初のクライアントから作成されます。
arturaz
プレイヤーのRuntimeConfigを設定するようなこと、たとえば、持っているアイテムなどについてです。
erickpassos
再度ですが、これはこうなります:
それはマッチメイキングではありません…:)
プレイヤーのランタイムデータを設定することはマッチメイキングではなく、それはマッチの設定/初期化です。
arturaz
そうですね、ただし、クライアントがマッチの設定を行う場合、悪意のあるクライアントは好きなデータを送信できてしまいます。
erickpassos
マッチメイキングは非常によく定義されています:
- キュー/サービスの入り口でプレイヤーをキューに入れる;
- 反対側でプレイヤーグループ(マッチ)を生成する。
あなたは2つの異なる側面を混同していると思います(編集済み)。
外部プレイヤーデータベースからのRuntimePlayerデータの設定は、Quantumプラグインから行うことができます(私もそれを推奨します)。
マッチメイキング(これはプレイヤーデータベースからの同じプレイヤーデータに基づく可能性があります)は別のものです:- プレイヤーをキューに入れる;
- マッチ/プレイヤーグループをキューから出す
arturaz
そうですね...
- マッチメイキングはプレイヤーをキューに入れ、適切なプレイヤーにルームIDを送信します。
- プレイヤーがルームに参加します(そのうちの1人がマスターになる?)
- 誰がゲームを開始するのですか?(マスターの接続が切れた場合はどうなりますか?マッチメイキングサービスによってルームが外部から開始されることはできますか?)
- ゲームが開始されると、カスタムサーバープラグインが外部サービスからプレイヤーのデータを取得し、runtimeconfig/runtimeplayerを設定します。
- お互いを攻撃します。
erickpassos
つまり、サーバーからプレイヤーデータを(権限を持って/安全に)設定することは、1.2.1で提供するプラグインのサンプルの一部になります。
ルームマッチは任意のクライアントによって開始できますが、ランタイムプレイヤーデータはサーバーから無視される可能性があり、そこからのみ設定されることになります。
arturaz
何が悪意のあるクライアントからルームを早すぎるタイミングで開始するのを防ぐのでしょうか?
erickpassos
例えば、サーバー側で全員がデータを送信するのを待ってから(そのデータは無視しますが、考慮には入れます)、その後に取得・送信することができます。
ルームを開始することは、エンティティが存在することを意味するわけではありません…:)
arturaz
しかし、それはシミュレーションが実行されていることを意味するのでしょうか?
erickpassos
はい、その点に問題はありません。
あなたのマッチメイキングサービスが全てのクライアントにルームを送信することを忘れないでください。
すべてのクライアントはほぼ同時に(わずかな違いがあるものの)参加します。
正しい方法は実際には、すぐに開始することです。
クライアントがマッチメイキングが完了する前にルームIDを知らない場合、開始することはできません…
arturaz
なるほど
erickpassos
全てのクライアントにルーム名を提供するのはあなたのマッチメイキングに任されていますので、彼らは皆そのまま参加します...
もちろん、サーバーを使用せずに外部サービスからRuntimePlayerデータをチェックする別の方法もあります。
マッチメイキング情報とともに、各プレイヤーについて検証したい情報(使用可能なヒーローなど)を含めておくことで、後ですべてのクライアントが、プレイヤーの1人が許可されていないヒーローを使用しようとした場合にチェックできます(ランタイムプレイヤーデータを使用して)。
なぜそう提案するのかというと、
- カスタムプラグインにはPhoton Enterprise Cloudが必要であり
- 現在使用中の運営しているテストクラウド(収益分配契約向けに提供されているもの)は、カスタムプラグインを許可していません。
arturaz
どちらにしてもEnterprise Cloudで実行しなければならないと思っていましたがそうではないのですか?
erickpassos
はい、収益分配契約がない限りそうなります。
1.2.1ではサンプルプラグインを入手できます。
ですので、お客様次第です。
今日はDiscordをログオフします。また明日戻ります。
arturaz
Back to topありがとうございます。多くのことがクリアになりました。