重要: UNet は非推奨のソリューションになり、現在、新しい Multiplayer とネットワーキングソリューション (Netcode for GameObjects) が開発中です。詳細は、GameObjects Web サイトの Unity Netcode を参照してください。 |
このページでは、マルチプレイヤーのプロジェクトを設定するときに、最も基本的で一般に必要なことの概要を説明します。プロジェクトに必要なものには、以下のものがあります。
Network Manager
ユーザーインターフェース (プレイヤーがゲームを見つけて加わるため)
ネットワーク化された プレイヤープレハブ (プレイヤーが制御するため)
マルチプレイヤーを認識する スクリプトとゲームオブジェクト
このリストには様々なバリエーションがあります。例えば、マルチプレイヤーチェスゲームやリアルタイムストラテジー (RTS) ゲームでは、目に見えるゲームオブジェクトでプレイヤーを示す必要はありません。 ただし、非表示の空のゲームオブジェクトでプレイヤーを作り、それにプレイヤーの能力に関するスクリプトをアタッチする場合もあります。
この入門ページは、上記の各項目について簡単に説明しています。 ただし、各セクションはより詳細なドキュメントにリンクしています。完全に理解するためには、これらのドキュメントを読むことが必要です。
さらに、ゲームを構築するときに理解し、選択する必要がある重要な概念がいくつかあります。 これらの概念は、だいたい以下のように要約できます。
クライアント、サーバー、ホスト の関係
ゲームオブジェクトとアクションに対する 権限
これらの概念を学ぶには、ネットワークシステムのコンセプト を参照してください。
Network Manager はマルチプレイヤーゲームのネットワーク関連を制御します。Network Manager は、シーンで 同時に 1 つだけを使用します。
Unity のビルトインの Network Manager コンポーネントは、マルチプレイヤーゲームを管理するためのすべての機能を1つのコンポーネントにまとめます。このコンポーネントで扱われていないカスタム要件がある場合は、このコンポーネントを使用する代わりに独自のネットワークマネージャーをスクリプトで作成できます。マルチプレイヤーゲームの作成を始めたばかりの場合は、このビルトインのコンポーネントを使用するとよいでしょう。
詳細は、 Network Manager を参照してください。
ほぼすべてのマルチプレイヤーゲームは、個々のゲームの「インスタンス」(「マッチ」とも呼ばれます)を見つけ、作成し、参加する方法をプレイヤーに提供します。ゲームのこの部分は一般に「ロビー」と呼ばれ、時にはチャットのような追加機能を備えています。
Unity には、NetworkManagerHUD という非常に基本的なビルトインのインターフェースがあります。 独自の UI を実装することなく簡単にマッチを作成してゲームをテストできるため、ゲームを作成する初期段階で非常に役立ちます。ただし、それは機能性と見た目のデザインの両方においてとても基本的であるため、プロジェクトを完成する前に独自の UI に置き換える必要があります。
詳細は、 Network Manager HUD を参照してください。
ほとんどのマルチプレイヤーゲームには、キャラクターや車、またはそれ以外のプレイヤーが制御するオブジェクトがいくつかあります。マルチプレイヤーゲームのなかには、目に見える「プレイヤーオブジェクト」ではなく、代わりに、チェスゲームやリアルタイムストラテジーゲームのように多くのユニットやアイテムを制御するものもあります。共有するキャンバスのペインティングゲームのように、特定のオブジェクトを扱わないゲームさえあります。ただし、このような状況では、通常、ゲーム内のプレイヤーを 概念的に 表すゲームオブジェクトを作成する必要があります。ゲームオブジェクトを プレハブ にして、ゲームでプレイヤーが行えることを制御するすべてのスクリプトをそれにアタッチします。
Unity の Network Manager コンポーネント (前述の Network Manager を参照) を使用している場合は、プレハブを Player Prefab フィールドに割り当てます。
ゲームの実行中に、Network Manager は、マッチに接続する各プレイヤーに対しプレイヤープレハブのコピー (インスタンス)を作成します。
これはマルチプレイヤーゲームのプログラミングに慣れていないユーザーを混乱させることですが、プレイヤーのプレハブインスタンスのスクリプトは、プレイヤーが制御するインスタンスが ホスト コンピューター (ゲームを管理するコンピューター) を使用しているか クライアント コンピューター (ゲームを管理するコンピューター以外) を使用しているかを認識できることが必要です。
なぜならどちらの場合も、同時に発生するからです。
マルチプレイヤーゲーム用のスクリプトを書くことは、シングルプレイヤー用のスクリプトを書くこととは異なります。なぜなら、マルチプレイヤーゲーム用のスクリプトを書くときには、スクリプトが実行されるさまざまなコンテキストについて考える必要があるからです。ここで説明するネットワークの概念については、ネットワークシステムの概念 を参照してください。
例えば、プレイヤープレハブに設定するスクリプトは、そのプレイヤーインスタンスの「所有者」がインスタンスを制御できるようにするべきですが、他の人がそれを制御することを許可すべきではありません。
サーバーとクライアント、どちらがスクリプトが行うことに関する権限を持つかについて考える必要があります。ときには、スクリプトをサーバーとクライアントの両方で実行する必要があります。それ以外の場合は、サーバー上だけでスクリプトを実行し、クライアントはゲームオブジェクトの動きを複製するだけです (例えば、プレイヤーが収集可能なゲームオブジェクトを集めるゲームでは、スクリプトはサーバー上でのみ実行する必要があります。そうすることによって、サーバーは収集されたゲームオブジェクトの数に関する権限をもつことができるからです)。
スクリプトの内容に応じて、スクリプトのどの部分をどの状況でアクティブにするかを決定する必要があります。
プレイヤーゲームオブジェクトの場合、各プレイヤーは通常、自身のプレイヤーインスタンスに対しアクティブな制御を有します。つまり、各クライアントが自身のプレイヤーに対するローカル権限を持ち、サーバーは、クライアントがプレイヤーが何をしているかについて通知することを受け入れるということです。
非プレイヤーのゲームオブジェクトの場合、サーバーは通常、発生したこと (アイテムが収集されたかどうかなど) に対する権限を持ち、すべてのクライアントは、そのゲームオブジェクトに発生したことについてサーバーが通知することを受け入れます。