Netcode for GameObjects で初めてのマルチプレイヤーゲームを作る

ESTEBAN MALDONADO / UNITY TECHNOLOGIESSenior Developer Advocate, Multiplayer Solutions
Oct 26, 2022|13 分
Netcode for GameObjects で初めてのマルチプレイヤーゲームを作る
このウェブページは、お客様の便宜のために機械翻訳されたものです。翻訳されたコンテンツの正確性や信頼性は保証いたしかねます。翻訳されたコンテンツの正確性について疑問をお持ちの場合は、ウェブページの公式な英語版をご覧ください。

こんにちは。Unity の開発者アドボケイトをしている Esteban Maldonado です。私の仕事は、Unity ゲーミングサービスに関する情報を広めること、マルチプレイヤー開発に取り組むためのツールをいち早く習得できる新しい教材を開発者のために制作することです。

そうしたソリューションの 1 つが Netcode for GameObjects(NGO)です。これは、Unity ゲームエンジン用に構築されたファーストパーティ製の中レベルネットワーキングライブラリです。ネットコードソリューションは、すべてのマルチプレイヤー開発プロジェクトにおいて不可欠です。

Unity の開発者アドボケイトの責任の 1 つは、私たちのツールを紹介するサンプルゲームを作ることです。そして、NGO のサンプルが私に割り当てられました。それが『Galactic Kittens』です。

私にはゲーム業界でのプロとしての経験が豊富にありますが、しかし個人的にマルチプレイヤーゲームを作った経験はほとんどないので、これはこのサンプルを使う開発者にとても勉強になることを示すだけでなく、私にとっても初めての分野でゲームを作る上で勉強になると証明する機会になりました。

私のチームと一緒に、『Galactic Kittens』のコンセプトを具体化しました。サンプルの難易度、基本的な仕組み、キャラクターの能力(後に割愛されました)などを決めました。

このサンプルゲームのプロジェクトに取り組むために、私は Bromio 社の優秀なチームと力を合わせ、洗練されたアートアセット、音楽とサウンドエフェクト、そしてプログラミングサポートをもってこのサンプルゲームを実現させるための仕事をしました。私たちの一致した目標は、Netcode for GameObjects を使って Unity でマルチプレイヤーゲームを作るための、シンプルで初心者に優しい入門用の教材を開発者に提供することでした。

このブログでは、『Galactic Kittens』のプロトタイプから安定版リリースまでの開発の道のりと、このサンプルを活用して皆さんが独自のマルチプレイヤープロジェクトの開発を始める方法について説明します。

『Galactic Kittens』とは何か。

開発に入る前に、私たちの新しいサンプルゲーム『Galactic Kittens』の簡単な概要をお伝えします。このサンプルは、マルチプレイヤーネットワーキングの基本を学ぶために設計された 2D 協力型宇宙冒険です。

このサンプルは以下のような、マルチプレイヤー開発を始めるために必要なテクニックを学ぶためのものです。

  • 自動シーン切り替えを伴うネットワークセッション管理
  • スプライトシートの変更を含む、基本的な 2D 動作の同期化
  • サーバー側での実行時のゲームオブジェクト生成
  • サーバーからプレイヤークライアントへのメインプレイヤーのオーナーシップ移譲
  • 接続されたすべてのクライアントの VFX 制作
  • すべてのクライアントにサウンドエフェクトや音楽を再生する方法
  • プレイヤーやゲームのステータス(ライフ、敵の撃破数など)の伝達と、ゲーム UI への表示

Galactic Kittens』については、私たちの ウェブサイト で詳しく学ぶことができます。また、GitHub から直接サンプルをダウンロードして、コードを実際に触ってみることもできます。

『Galactic Kittens』はどのように作られたか
開発しながら学ぶ

私にはマルチプレイヤーゲームを作った経験があまりありませんが、Unity はユーザーが NGO を使い始める上で役立つリソースをたくさん公開してくれています。

これらのリソースと、Unity Multiplayer のドキュメントを使いつつ、私はまず基本的なネットワークの概念と用語に慣れるという非常にシンプルなスタートを切りました。次に、Hello World プロジェクトのチュートリアルをこなし、利用できる 手ごろなサイズのサンプル を研究することで、手ごたえを得られるようになってきました。

ある程度試行錯誤を重ねたら、ゼロからベースとなる簡単なプロトタイピングを作ることができました。

そう、これが私が『Galactic Kittens』を実現するための最も初期の試みでした。

この時点では、カスタムロビーも、本物の UI も、本物の接続管理もありませんでした。これを見ればおわかりかと思います。プロトタイプは、2 隻のまったく同じ船(それぞれヒットポイントは 3 つ)が画面内を動き回り、スペースキーを押すとキューブの弾が発射されるだけのものでした。クライアント間でのオブジェクトのスポーンや動きの同期を見るのにちょうどよかったのです。

始まりはこんなものでした。しかし、Bromio の協力を得られれば、目標を達成して、このプロトタイプを実際に動くサンプルに仕上げられるだろうと思っていました。

プロトタイプから宇宙探査へ

私が最初の進捗を出した後、Bromio 社と一緒にプロトタイプをより製品に近い形に仕上げる作業に入りました。彼らも私と同じように、マルチプレイヤーゲームを作った経験はあまりなかったのですが、課題に積極的に取り組み、私たちの目標達成に協力してくれました。

より効率的に作業するために、私たちはゲームを孤立したコンポーネントに分解し、アーティストがアセットに取り組み、プログラマーがゲームのコアロジックに取り組むという形で並行して開発を始めました。

Galactic Kittens.』のアートスタイルの進化の一端をご覧ください。

一方、Bromio のメイン開発者と私は、『Galactic Kittens』を実際に動くゲームサンプルにするための楽しい部分、それと課題となる部分を見つけだしていました。

接続管理

開発で最も苦労したのは、接続の管理とキャラクター選択です。キャラクターのデータを別々の ScriptableObject ファイルに格納する必要がありました。これは、プロジェクトをダウンロードすると表示されます。

これらのファイルには、UI に表示するスプライト(プレイヤーと船)や、ゲームプレイのシーンが始まったら各プレイヤーに生成されるべきプレハブなど、それぞれの宇宙探査機に関する必要な情報が含まれています。

キャラクター選択画面では、クライアントが切断されたときのイベントを確実に認識し、UI で処理することが大きな課題でした。

同じキャラクターを選べないようにすることで、開発者が自分のゲームで実際それをやろうとしたときどうやるのかを示そうと考えたのです。(同じキャラクターを選ばせるのは、制約がないので実は簡単です。)

サンプルゲーム『Galactic Kittens』のキャラクター選択画面。

接続管理の次の課題は、ゲームセッションの途中でプレイヤーの接続が切断される現象でした。この課題に対処するには、プレイヤーが退場しても対応できるようにするだけでなく、ゲームのセッション中は他にセッションに入ろうとするプレイヤーをブロックする必要がありました。そこで、接続マネージャーを、ホストインスタンスがキャラクター選択画面にいる間だけ、新しい接続を許可にするようにしました。これはどこでも通用する解決策ではありません。進行中のセッションに遅れて参加できるゲームもありますし、そうでないゲームもあります。何が自分たちの体験にとって最善なのかを決めるのは開発者です。

基本的な敵キャラクター

プレイヤーが目にする敵や隕石には複雑な AI や派手な動作ロジックを積まず、ゲームプレイをシンプルにするよう心がけました。こうすることで、ユーザーの目を NGO ライブラリの使い方から逸らせることのない、完全なゲームサンプルを提供することができました。

こういう考え方のため、敵は大きく分けて 2 種類、隕石の障害物は 1 種類だけです。

スペースシューター スペースゴースト 隕石

どちらの敵もランダムな動きのパターンを取りますが、スペースシューターはレーザーを撃ち返してきます。これらの敵の作り方や、独自のロジックを追加する方法については、開発者ガイドを参照してください。

ボス戦

ボス戦の実装に移る頃には、ゲームのロビーやプレイヤーのスペースシップの挙動、シンプルな敵などの実装で得た教訓を活かし、ボス戦の実装を素早く進められる状態になっていました。

特に苦労したのは、ボスが登場する前に聞こえてくる警告アラームを出すタイミングです。最終的には、クライアントとサーバーの RPC を使って、通常のプレイ体験が終わり、最後のボス戦が始まることを知らせるイベントを送りました。

ギャラクティックキトゥンズ サンプルゲーム "警告" GIF

ボスの挙動は有限ステートマシン(FSM)で構成されており、接続されたプレイヤーに対してどの攻撃セットを投げつけるかをランダムに選択するというものです。この処理のために BossController という C# のクラスを使い、ボスをある状態から別の状態へと遷移させる処理を行いました。このボス戦を実現しているコードや、ボスに独自の状態を追加する方法については、開発者ガイドをご覧ください。

開発中に役立ったもの
マルチプレイヤーコミュニティ

このサンプルゲームを作るというミッションを成功させられた要因として第一に挙げるべきは、Unity マルチプレイヤーネットワーキングDiscordサーバー に参加して、コミュニティに質問したことです。ここでは、実際にマルチプレイヤーゲームを作っている他の開発者や、Unity のマルチプレイヤーサービスの開発に関わる人たちに話を聞くことができました。この場所にある集合知が、私たちをゴールへと導いてくれたのです。

マルチプレイヤーのドキュメンテーション

Unity で働くと、マルチプレイヤー開発を始めようとしているすべての人に役立つようデザインされたリソースやドキュメンテーションの開発に励んでいる、ネットワークに精通した人たちと一緒に働く機会が得られます。Unityマルチプレイヤードキュメンテーションサイトには何度も助けられました。基本的なネットワーク用語に親しむところから、レイテンシの扱い、NGOを使った実際のコーディングまで、さまざまなレベルで役に立ちました。

次は何を学ぶのか

私たちは『ギャラクティックキトゥンズ』を世に送り出せたことを非常に嬉しく思っています。皆さんや未来の NGO ユーザーに、このサンプルをマルチプレイヤー学習において正しい方向へ踏み出すためのステップとして使っていただければと思います。ご質問やご意見・ご要望は、Discordサーバーまたはフォーラムにてお気軽にお知らせください。

私が学びたいと思っていることの 1 つは、オブジェクトプーリングをマルチプレイヤーゲームサンプルに追加する方法です。これは、ゲームセッション中に繰り返し生成されるオブジェクトに対して、必要なメモリをあらかじめ確保するためのテクニックです。以前行った実験では、オフラインの Unity プロジェクトでこのテクニックを試してみましたが、ゲームの実行時の効率を確実に向上させることができました。このテクニックは『ボスルーム』や、その他の UGS サンプルにも使われています。

マルチプレイヤー開発の学習はどのように始めるべきか

もし皆さんがマルチプレイヤーに取り組み始めたのなら、Unity で私がいるチームが提供している豊富なリソースが、皆さんにとっての助けになります。

まずは Netcode for GameObjects のページを開き、パッケージに慣れることをお勧めします。次に『ギャラクティックキトゥンズ』のサンプルで NGO に触れたり、手ごろな規模のサンプルを使って少しずつ学習を進めたりすることができます。

取り組みを始めたら、Unityマルチプレイヤーネットワーキング Discord サーバーに参加し、フォーラムをチェックすることをお勧めします。また、『ギャラクティックキトゥンズ』がシンプルすぎる、あるいはチャレンジが足りないと感じたら、ぜひ『ボスルーム, 』をご覧ください。これは NGO 開発を製品レベルまで高めた完全な 3D サンプルゲームです。

ゲームのオンライン化については、Unityゲーミングサービスが皆さんをさらに支援してくれるでしょう。LobbyMatchmaker サービス、 Vivox による音声およびテキストチャット、あるいは P2P Relay サービスや ゲームサーバーホスティングなど、さまざまなサービスが揃っています。制作を楽しもう!

最近のトレンドとマルチプレイヤーの将来について詳しく知りたい方は、2022 Unity Multiplayer Reportをご覧ください。これは、米国、英国、日本、韓国の1,500を超える調査回答の結果を集約したものです。