Local Discovery
シングルプレイヤーゲームを Unity Multiplayer に変換

シーンオブジェクト

動的に生成するオブジェクトは NetworkServer.Spawn() を使用してネットワークに追加しますが、すでにシーン内に存在するオブジェクトは処理が異なります。こういったオブジェクトはクライアントとサーバーの両方にシーンと共にロードされ、オブジェクト生成メッセージが送られる前にランタイムで存在していることになります。

シーン内の、NetworkIdentity コンポーネントのあるすべてのオブジェクトは、クライアントおよびサーバーの両方において、シーンがロードされる際に無効になります。そしてシーンが完全にロードされると、これらのネットワーク上のシーンオブジェクトをアクティベートするために NetworkServer.SpawnObjects() が呼び出されます。これは、サーバーのシーンのロードが完了すると NetworkManager によって自動的に行われますが、ユーザーコードで直接呼び出すことも可能です。この結果、ネットワーク上のシーンオブジェクトは特殊な方法で生成されることになります― 新しいインスタンスが作成される代わりに、既存のインスタンスがネットワークに繋がれることになります。

動的に生成されたオブジェクトの代わりにシーンオブジェクトを使用するのには理由があります。これらのオブジェクトは:

  • ステージ(level)と共にロードされるため、ランタイムにおける中断がありません。
  • プレハブからさらに修正を加えられます。
  • シーン内の他のオブジェクトインスタンスによって参照されることが可能なため、ランタイムで繋げるオブジェクトを探す必要がなくなります。

NetworkServer.SpawnObjects() によって一度生成されたシーンオブジェクトの挙動は、その他の生成オブジェクトと同様になります。アップデートが送られ、ClientRPC コールが行われます。

クライアントがゲームに参加する前にシーン内のオブジェクトがサーバー上で破棄されると、そのオブジェクトはその先、そのクライアント上では一切生成されません。

ネットワーク上のシーンオブジェクトは、ネットワークが開始されると無効化されます。シーン内にあるシーンオブジェクトで NetworkIdentity を持つものはすべて、ネットワーク上のシーンオブジェクトです。

サーバー上で、これらのオブジェクトは、NetworkServer.SpawnObjects() が呼び出されると有効化されます。つまりサーバーが起動された時、あるいはシーンのサーバーへのロードが終了した時です。接続されたクライアントは、そのクライアントから見えるサーバー上のシーンオブジェクトのひとつひとつに関して ObjectSpawnScene オブジェクト生成メッセージを受け取ります。このメッセージによってクライアント上のオブジェクトが有効化されます。またこのメッセージは、サーバーにおけるそのオブジェクトの最新の状態を持っています。従って、クライアント上でアクティベートされるのは、そのクライアントから見えるクライアントでサーバー上で破棄されていないもののみになります。また、通常の非シーンオブジェクト同様、これらのシーンオブジェクトも、クライアントがゲームに参加した時点で最新の状態からスタートします。

Local Discovery
シングルプレイヤーゲームを Unity Multiplayer に変換