こんにちは。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』の概要を簡単に説明しておきます。このサンプルは 2D 協力型スペースアドベンチャーで、マルチプレイヤーネットワーキングの基本を学べるように設計されています。
このサンプルは以下のような、マルチプレイヤー開発を始めるために必要なテクニックを学ぶためのものです。
『Galactic Kittens』については、Unity のウェブサイトに情報があります。また、GitHub から直接サンプルをダウンロードして、コードを実際に触ってみることもできます。
私にはマルチプレイヤーゲームを作った経験があまりありませんが、Unity はユーザーが NGO を使い始める上で役立つリソースをたくさん公開してくれています。
これらのリソースと、Unity Multiplayer のドキュメントを使いつつ、私はまず基本的なネットワークの概念と用語に慣れるという非常にシンプルなスタートを切りました。次に、Hello World プロジェクトのチュートリアルをこなし、利用できる手ごろなサイズのサンプルを研究することで、手ごたえを得られるようになってきました。
ある程度試行錯誤を重ねたら、ゼロからベースとなる簡単なプロトタイピングを作ることができました。
この時点では、カスタムロビーも、本物の UI も、本物の接続管理もありませんでした。これを見ればおわかりかと思います。プロトタイプは、2 隻のまったく同じ船(それぞれヒットポイントは 3 つ)が画面内を動き回り、スペースキーを押すとキューブの弾が発射されるだけのものでした。クライアント間でのオブジェクトのスポーンや動きの同期を見るのにちょうどよかったのです。
始まりはこんなものでした。しかし、Bromio の協力を得られれば、目標を達成して、このプロトタイプを実際に動くサンプルに仕上げられるだろうと思っていました。
私が最初の進捗を出した後、Bromio 社と一緒にプロトタイプをより製品に近い形に仕上げる作業に入りました。彼らも私と同じように、マルチプレイヤーゲームを作った経験はあまりなかったのですが、課題に積極的に取り組み、私たちの目標達成に協力してくれました。
効率的に作業を進めるため、ゲームを個別のコンポーネントに分解し、アーティストはアセットを、プログラマーはゲームのコアロジックを担当するというように、並行して開発をスタートさせました。
『Galactic Kittens』のアートスタイルの進化の一端をご覧ください。
一方、Bromio のメイン開発者と私は、『Galactic Kittens』を実際に動くゲームサンプルにするための楽しい部分、それと課題となる部分を見つけだしていました。
開発で最も苦労したのは、接続の管理とキャラクター選択です。キャラクターのデータを別々の ScriptableObject ファイルに格納する必要がありました。これは、プロジェクトをダウンロードすると表示されます。
これらのファイルには、UI に表示するスプライト(プレイヤーとスペースシップ)や、ゲームプレイのシーンが始まったら各プレイヤーに生成されるべきプレハブなど、それぞれのスペースシップに関する必要な情報が含まれています。
キャラクター選択画面では、クライアントが切断されたときのイベントを確実に認識し、UI で処理することが大きな課題でした。
同じキャラクターを選べないようにすることで、開発者が自分のゲームで実際それをやろうとしたときどうやるのかを示そうと考えたのです(同じキャラクターを選べるようにするほうが制約がないので実は簡単です)。
接続管理の次の課題は、ゲームセッションの途中でプレイヤーの接続が切断される現象でした。この課題に対処するには、プレイヤーが退場しても対応できるようにするだけでなく、ゲームのセッション中は他にセッションに入ろうとするプレイヤーをブロックする必要がありました。そこで、接続マネージャーを、ホストインスタンスがキャラクター選択画面にいる間だけ、新しい接続を許可にするようにしました。これはどこでも通用する解決策ではありません。進行中のセッションに遅れて参加できるゲームもありますし、そうでないゲームもあります。何が自分たちの体験にとって最善なのかを決めるのは開発者です。
プレイヤーが目にする敵や隕石には複雑な AI や派手な動作ロジックを積まず、ゲームプレイをシンプルにするよう心がけました。こうすることで、ユーザーの目を NGO ライブラリの使い方から逸らせることのない、完全なゲームサンプルを提供することができました。
こういう考え方のため、敵は大きく分けて 2 種類、隕石の障害物は 1 種類だけです。
![]() | ![]() | ![]() |
---|---|---|
スペースシューター | スペースゴースト | 隕石 |
どちらの敵もランダムな動きのパターンを取りますが、スペースシューターはレーザーを撃ち返してきます。これらの敵の作り方や、独自のロジックを追加する方法については、 開発者ガイドを参照してください。
ボス戦の実装に移る頃には、ゲームのロビーやプレイヤーのスペースシップの挙動、シンプルな敵などの実装で得た教訓を活かし、ボス戦の実装を素早く進められる状態になっていました。
特に苦労したのは、ボスが登場する前に聞こえてくる警告アラームを出すタイミングです。最終的には、クライアントとサーバーの RPC を使って、通常のプレイ体験が終わり、最後のボス戦が始まることを知らせるイベントを送りました。
ボスの挙動は有限ステートマシン(FSM)で構成されており、接続されたプレイヤーに対してどの攻撃セットを投げつけるかをランダムに選択するというものです。この処理のために BossController という C# のクラスを使い、ボスをある状態から別の状態へと遷移させる処理を行いました。このボス戦を実現しているコードや、ボスに独自の状態を追加する方法については、開発者ガイドをご覧ください。
このサンプルゲームを作るというミッションを成功させられた要因として第一に挙げるべきは、Unity Multiplayer Networking Discord サーバー に参加して、コミュニティに質問したことです。ここでは、実際にマルチプレイヤーゲームを作っている他の開発者や、Unity のマルチプレイヤーサービスの開発に関わる人たちに話を聞くことができました。この場所にある集合知が、私たちをゴールへと導いてくれたのです。
Unity で働くと、マルチプレイヤー開発を始めようとしているすべての人に役立つようデザインされたリソースやドキュメンテーションの開発に励んでいる、ネットワークに精通した人たちと一緒に働く機会が得られます。Unity マルチプレイヤードキュメンテーションサイトには何度も助けられました。基本的なネットワーク用語に親しむところから、レイテンシの扱い、NGO を使った実際のコーディングまで、さまざまなレベルで役に立ちました。
私たちは『Galactic Kittens』を世に送り出せたことを非常に嬉しく思っています。皆さんや未来の NGO ユーザーに、このサンプルをマルチプレイヤー学習において正しい方向へ踏み出すためのステップとして使っていただければと思います。ご質問やご意見・ご要望は、Discord サーバーまたはフォーラムにてお気軽にお知らせください。
私が学びたいと思っていることの 1 つは、オブジェクトプーリングをマルチプレイヤーゲームサンプルに追加する方法です。これは、ゲームセッション中に繰り返し生成されるオブジェクトに対して、必要なメモリをあらかじめ確保するためのテクニックです。以前行った実験では、オフラインの Unity プロジェクトでこのテクニックを試してみましたが、ゲームの実行時の効率を確実に向上させることができました。このテクニックは『Boss Room』や、その他の UGS サンプルにも使われています。
もし皆さんがマルチプレイヤーに取り組み始めたのなら、Unity で私がいるチームが提供している豊富なリソースが、皆さんにとっての助けになります。
まずは Netcode for GameObjects のページを開き、パッケージに慣れることをお勧めします。次に『Galactic Kittens 』のサンプルで NGO に触れたり、手ごろな規模のサンプルを使って少しずつ学習を進めたりすることができます。
取り組みを始めたら、Unity Multiplayer Networking Discord サーバーに参加し、フォーラムをチェックすることをお勧めします。また、『Galactic Kittens』がシンプルすぎる、あるいはチャレンジが足りないと感じたら、ぜひ『Boss Room』をご覧ください。これは NGO 開発を製品レベルまで高めた完全な 3D サンプルゲームです。
ゲームのオンライン化については、Unity ゲーミングサービスが皆さんをさらに支援してくれるでしょう。Lobby や Matchmaker サービス、 Vivox による音声およびテキストチャット、あるいは P2P Relay サービスや ゲームサーバーホスティングなど、さまざまなサービスが揃っています。制作を楽しみましょう!
最近のトレンドとマルチプレイヤーの将来について詳しく知りたい方は、米国、英国、日本、韓国の 1,500 を超える調査回答を集約した「Unity マルチプレイヤーレポート 2022」をご覧ください。