マルチプレイヤー協力ゲームのために分散権限を活用する方法

アーケインアルパカが今年初めにSteamで彼らの魅力的なFPSシューターダガーディレクティブの最初のデモをリリースしたとき、全体的なフィードバックは素晴らしかったが、コミュニティはこのゲームを一緒にプレイしたいと明確に伝えた。その反応に基づいて、チームはゲームにマルチプレイヤー機能を追加することを決定した。彼らはいくつかの異なるソリューションをテストした後、最終的にUnity 6に含まれるビルトインのマルチプレイヤーソリューションのスイートを選ぶことに決めた。私たちはプログラマー兼デザイナーのダニエル・ファウラーと座って、彼らがUnityのNetcode for GameObjects、リレー、その他のネットワーキングサービスをどのように活用してプレイヤーを接続し、分散権限(DA)がどのように全体の運営をスリムでスケーラブルなサーバーサポートで支えているかを学んだ。
アーケインアルパカがどのように始まり、何を作りたかったのかについて少し話しましょう。
ダニエル・ファウラー、プログラマー兼デザイナー:私は数年前にこの会社を始めました。その前は、私たち – ウェイド・ヒリバー、コディ・ローランド、そして私 – がOculusでオンワードというVR FPSゲームに取り組んでいて、大企業で働くことから離れたかった。
私はこのプロジェクトを自分で始め、その後必要に応じて他の二人を参加させました。私はMicroProseと出版契約を結び、デモをリリースしました。デモは非常にうまくいき、私たちはコミュニティからのフィードバックの中で最も重要なポイントだったため、マルチプレイヤーを追加したいと思った。それ以来、ゲームは順調に進んでいる。私たちはローンチし、コンテンツパックをリリースしようとしている。
数週間前、Unityチームと話した後にネットワーキングアップデートをリリースしました – 彼らは私たちにいくつかのフィードバックをくれ、私たちもいくつか共有し、多くの良いアイデアを得て、それを通じて実装しました。マルチプレイヤーは今はずっと安定しており、コミュニティからのフィードバックは主にポジティブですが、もちろんまだ解決すべき問題もいくつかあります。
それは素晴らしいですね!このプロジェクトでは他に何が進行中ですか?
私はこのプロジェクトを4年半前に始めました。その時、私たちはオンワードをQuestに移植していたので、高性能のPC VRゲームを携帯電話に移そうとしていました。それを行うために、私たちはたくさんのものを削除しなければなりませんでした – 特に草を、そしてOculusではコンピュートシェーダーを使用できませんでした。プロジェクトを始めて、大量の草を生成し、効率的に動作させる方法を見たかった。最終的に、バーストコンパイラーを使用して、プレイヤーがマップを移動する際に、数百万のポリゴンの草、小さな植物、花を生成するカスタム草システムを構築した。
プレイヤーは任意の時間帯を選択してミッションを開始でき、プレイ中に時間が進むため、午前6時にミッションを開始して1時間待つと、太陽の位置がその分だけ移動する。完全なリアルタイムライティングを使用し、自分たちの空のシェーダーを構築した。ポストプロセッシングもこれに影響され、すべての値とそれが日中にどのように変化するかを保持するためにスクリプタブルオブジェクトがバックアップされ、ライティングと時間帯がAIの行動やセンサーに影響を与える。
リアルタイムライティングをいじりたかったので、時間帯の要素を追加した。なぜなら、私たちは次のゲームの準備もしていたからだ。これは私の楽しい週末のプロジェクトだった。しばらくしてからキャラクターを追加し始め、ここに全体のゲームがあるように感じ始めた。それをもう少し構築し、職場の人々にプレイしてもらったところ、彼らは楽しんでくれた。
リアルタイムライティングと数百万のポリゴンの草が可能なのは、ユニバーサルレンダーパイプライン (URP)とフォワード+レンダリングを使用し、GPU常駐ドロワーとGPUオクルージョンカリングを組み合わせているからだ。Unity 2021.3からUnity 6にアップグレードする前に、SRPバッチャーを使用していた。常駐ドロワーとオクルージョンカリングは、SRPバッチャーに対して約20%のパフォーマンス向上をもたらした。低複雑度のシェーダーとテクスチャもパフォーマンス向上に寄与した。RenderDocを使用してサンプリングしながら、すべてが機能していることを確認し、問題が発生するたびに修正した。最終的に、SteamDeckで中程度のグラフィックス設定で30-60 fpsでプレイできる。
プレイヤーが好きなことをできる大きなオープン環境を構築したかった。それはコールオブデューティのようなものではなく、同じ敵が同じ位置にスポーンする同じ廊下を進むのではなく、サンドボックスのようなものだ。プレイヤーに異なる目標に対するアプローチの自由を与え、時間帯を組み合わせたかった。そして、協力プレイでは、個人または2人のチームに分かれることができるか、4人の大きなグループに留まることができる – それがかなりの追加要素となった。
ゲームを拡張する予定で、さらに5つのミッションが来る。最初のコンテンツパックを完成させ、さらに12の武器、14または16の制服オプション、そして新しい装備を追加した。
私は古いデルタフォースとゴーストリコンのゲームを本当に楽しんだので、それらに似たものを作りたいと思いました。私はエンジニアであり、あまりアーティストではないので、アートスタイルをシンプルに保つ必要がありました。私は自分ができるアートに集中していました。だから、もし自分でゲーム全体を作らなければならない場合でも、できると思っていました。それがゲームのスタイルの由来です。しかし、リアルタイムのライティング効果とポストプロセッシングを古い見た目のテクスチャとローポリモデルと混ぜることで、うまくいったと思います。それは多くのものを一緒に追加するようなものです。
ヴァルハイムが出たときに多くのインスピレーションを与えてくれたと思います。なぜなら、それ以前はポストプロセッシングやライティング効果があまりなく、90年代中頃のゲームのように見えたからです。それから、彼らが持っていた多くの効果を見て、私もそれができると思いました。
いつUnity 6に切り替えましたか?
プロジェクトはUnity 2019で始まり、その後Unity 2021.3にアップグレードしました。私はそれを昨年の遅い時期まで放置していて、GPUオクルージョンカリングを試すためにUnity 6にアップグレードしました。それにより、パフォーマンスが15%から20%向上しました。
以前は、URPといくつかの他のものと一緒にSRPバッチャーを使用していましたが、それらをすべてオフにしてGPUオクルージョンカリングだけを使用できました。私はLODを使用していませんが、画面サイズに基づいてカリングする設定があるので、それをすべてオンにしました。再び、パフォーマンスが15%から20%向上しました。そして、今はSteamデッキでゲームを動かしています。パフォーマンスの向上を見て以来、戻っていません。

ネットワーキング側についてもう少し話しましょう – リレーはどのように使用していますか?
主にプレイヤーのためのもので、彼らがルーターにたくさんの設定をする必要がないようにしています。私はいくつかのマルチプレイヤーシステムをテストして、何がうまくいくかを見るために数日間ポートフォワーディングを試しました。最初はかなり早くセットアップできましたが、Unity 6のマルチプレイヤーをネットワークに使用することに決めた後、リレーを設定し、その方法でテストを行っています。
パフォーマンスのために、ネットワークシミュレーターを使用しており、うまく機能しています。ホットスポットで携帯電話に接続するだけで、パフォーマンステストにかなり役立ちました。
分散権限も使用しました。それはどのようにして実現しましたか?
デモをリリースした後、このゲームのマルチプレイヤーを検討しました。最大のフィードバックポイントは、人々が協力プレイを望んでいたことです – それが大きな要素になることは分かっていましたが、2作目のゲームのために取っておこうと思っていました。
しかし、フィードバックの量とパブリッシャーと話した後、どれくらい時間がかかるか見てみることに決めました。Photonを試し、その後PhotonのFusionシステムを試し、他のいくつかのライブラリも見ました。自分で構築することを考えましたが、Netcode for GameObjectsを試してみることに決めました。分散権限を試すことに決めました。基本的にゲーム全体が完成していたので、GameObjectsの所有権変更のリクエストと承認を扱いたくありませんでした。
協力ゲームなので、プレイヤーが不正をすることはあまり心配していません – 友達と不正をしているなら、それは彼ら次第です。ゲーム内にもチートがあるので、無限弾薬などをオンにできるので、オブジェクトを複製してもあまり関係ありません。
それが私がDAを選ぶ決め手になりました。この設定を迅速に行うことができたので、他の2人のメンバーはコンテンツの仕上げに取り組むことができ、私はすべてのネットワーク関連の作業に集中できました。すべてを完了するのに12または13週間かかると見積もりましたが、結局約14週間かかりました。

リレーを使用していたので、時々直接接続モードで実行するのですか?
そうですねプレイヤーが自分で実行できるように直接接続も設定しましたし、友達が直接接続できるようにしました。彼らはルーターでポートフォワーディングを設定する必要がありますが、その設定方法についての指示があります。しかし、ホストの移行はないので、ホストが切断されると、全員のゲームが終了します。
この機能は、スタジオが閉鎖された場合やUnityがリレーサーバーをシャットダウンした場合でも、プレイヤーが直接接続ゲームをプレイできるようにするためのものです。
それは理にかなっています。それは非常に先見の明があり、プレイヤーにとっても良いことなので、聞けて嬉しいです。
私が過去15年間に関わったほぼすべてのゲームはマルチプレイヤーであり、それは私がいたどこでも問題でした。何かが予期せずシャットダウンし、何かを修正するために慌てなければなりませんでした。私はそのようなことに先手を打ちたかったのです。
あなたはディスカッションでホスト移行と所有権の移転について言及しました。DAがこれに持つ価値についてどう思いますか?あなたのゲームにとって良い追加であり、開発を助けていますか?
特にホスト移行はほぼシームレスでした。再度、これは私が過去に関わったゲームで常に問題だったことの一つで、ホストが突然いなくなり、たくさんのことを切り替え、誰が何を所有しているかを決めなければなりませんでした。
しかし、うまくいったことがたくさんありました。私はこれを永遠にやってきたので、それが起こるのを見て、最初は非常に疑わしいです。しかし、私たちは問題がなく、もし小さな問題に直面した場合は、ドキュメントを見て、「ああ、次の人にこのゲームオブジェクトを自動的に転送するというボックスをチェックするのを忘れた」とか、そんな感じです。適切に設定することを確認するだけの問題でしたので、問題が発生した場合は、このシステムで迅速に修正できます。
こちらをチェックしてくださいダガーディレクティブの早期アクセス版をSteamで、チームの最新の更新をこちらでご覧ください。分散権限や他のUnityのマルチプレイヤーソリューションについてもっと学び、Unity開発者のストーリーをリソースページで見つけてください。
