Note: UNet is deprecated, and will be removed from Unity in the future. A new system is under development. For more information and next steps see this blog post. |
Unity のマルチプレイヤーシステムには 2 つの種類の ネットワーク化されたオブジェクト があります。
ランタイム に動的に作成されるもの
シーンの一部として保存されるもの
ランタイムに動的に生成されるオブジェクトは、Multiplayer の スポーン システムを使用して作成されますが、オブジェクトをインスタンス化する元のプレハブは、Network Manager のリストに登録されていなければなりません。
ただし、シーンの一部として保存され (そのため、ロードされるときにすでにシーン内に存在する) ネットワーク化したゲームオブジェクトは処理が異なります。このようなオブジェクトはクライアントとサーバーの両方にシーンの一部としてロードされ、Multiplayer システムからスポーンメッセージが送られる前に、ランタイムに既に存在します。
シーンがロードされるとき、シーンに保存されネットワーク化されたゲームオブジェクトはすべて、クライアントとサーバー両方で無効にされます。その後、シーンが完全にロードされると、Network Manager がシーンのネットワーク化されたオブジェクトを自動的に処理して、すべてを登録し (そのため、それらはクライアント間で同期されます)、まるでそれらがランタイムにスポーンされたように有効にします。
シーンがロードされてから動的にゲームオブジェクトをスポーンする方法を使わず、ネットワーク化されたゲームオブジェクトをシーンに保存することには、いくつかの利点があります。
ネットワークマネージャーがネットワーク化したシーンのオブジェクトを生成するとき、それらのゲームオブジェクトは動的に生成されたゲームオブジェクトのように挙動します。Unity はゲームオブジェクトに更新と ClientRPC の呼び出しを送信します。
クライアントがゲームに参加する前にシーンのあるゲームオブジェクトがサーバー上で破棄されると、そのゲームオブジェクトは新しく加わったクライアントでは決して使用できません。
クライアントが接続すると、クライアントは、サーバーに存在しクライアントから可視なシーンゲームオブジェクトすべてに関する ObjectSpawnScene スポーンメッセージを受信します。このメッセージはクライアント上のゲームオブジェクトを有効にします。またこのメッセージは、サーバーにおけるそのオブジェクトの最新の状態を持っています。従って、そのクライアントから見えるゲームオブジェクト、しかも、サーバー上で破棄されていないもののみがクライアントでアクティベートされます。通常のシーンに保存されていないゲームオブジェクト同様、シーンのネットワーク化されたゲームオブジェクトも、クライアントがゲームに参加した時点で最新の状態からスタートします。