・サーバから切断した時点で、自分自身が生成したオブジェクトは、ネットワーク越しに消失するため、 再接続した時に、クライアント側からネットワーク越しに再生成をします。 ・途中断線の場合、サーバから切断→再接続までは自動化させます。 (今回は省略しますが、できれば、「再接続しますか?」のアナウンスがあると良いです。)
using System; using UnityEngine; public class Foo : MonobitEngine.MonoBehaviour { // プレハブ名(仮) string prefabName = "prefabName"; // バックアップ対象となるゲームオブジェクトと、その座標値・回転量の情報 GameObject gameObj = null; Vector3 position = Vector3.zero; Quaternion rotation = Quaternion.identity; public void Update() { // Network.Instantiate を実行する。 // 説明上、「ルーム内に入室していて、オブジェクトが生成されていないとき」にリアルタイムに生成するものとする。 if( MonobitEngine.MonobitNetwork.isConnect && MonobitEngine.MonobitNetwork.inRoom ) { if( gameObj == null ) { gameObj = MonobitEngine.MonobitNetwork.Instantiate( prefabName, position, rotation, 0 ); } // 座標値・回転量の退避 position = gameObj.transform.position; rotation = gameObj.transform.rotation; } /* * その他、gameObj の制御や、接続制御など。 */ } }
・切断された場合 OnDisconnectedFromServer のコールバックが呼び出される。 → ひとまずサーバに再接続する。 ・再接続が完了し、ロビーに入室できたら、OnJoinedLobby のコールバックが呼び出される。 → 以前入室していたルームに再入室する。 同時に、プレハブ情報など、必要な情報を復元するための処置を行なう。
// 上記で説明したクラスと同クラスに追記。 public class Foo : MonobitEngine.MonoBehaviour { // ルーム名の退避 string roomName = ""; public void Update() { /* * 上述の内容(省略) */ // ルーム名を退避する if( MonobitEngine.MonobitNetwork.isConnect && MonobitEngine.MonobitNetwork.inRoom ) { roomName = MonobitEngine.MonobitNetwork.room.name; } /* * その他、gameObj の制御や、接続制御など */ } // 途中切断されたときの処理 public void OnDisconnectedFromServer() { /* * MoobitEngine.MonobitNetwork.ConnectServer を使って、サーバへの再接続を実行する(省略) */ } // 接続完了&ロビーへの接続完了したときの処理 public void OnJoinedLobby() { // 退避しておいたルーム名に入室する if( !String.IsNullOrEmpty(roomName) ) { MonobitEngine.MonobitNetwork.JoinRoom(roomName); // ここで gameObj をリセット gameObj = null; } } }