private int creatable_block_num_ = 16; // 生成可能ブロック数 // リモートオブジェクト生成 public override void spawnRemote(NetworkObjectData nod) { // transform は Instantiate で更新済み name_ = nod.getName(); // 名前更新 color_ = nod.color; // 色更新 Destroy(GetComponent<Collider>()); // リモートオブジェクトはコリジョンなしにする }
// 送信開始 public void startSend(float freq) { Debug.Assert(isLocal); // 送るのはローカルだけ send_frequency_ = freq; // 共有データを生成 sharedNod = NetworkObjectData.create(NetworkManager.peerId, generation_); ++generation_; // 世代を進める StartCoroutine(send()); // 送信開始 }
// ローカル(送信元)オブジェクト用の作成 public static NetworkObjectData create(uint peer_id, uint object_id) { var nod = new NetworkObjectData(); nod.peer_id_ = peer_id; nod.object_id_ = object_id; nod.data_ = new byte[DATA_SIZE]; for (var i = 0; i < DATA_SIZE; ++i) nod.data_[i] = 0; return nod; }
public void InstantiateGameObject(byte[] data, Socket socket, int from) { NetworkObjectData objectData = ByteParser.ConvertDataToObject(data) as NetworkObjectData; if (objectData.index >= ClientManager.instance.GetClientSettings().networkedObjects.Count) { Logging.CreateLog("Error: Object not found: " + objectData.index + ", " + ClientManager.instance.GetClientSettings().networkedObjects.Count); return; } SNetwork.Network.Instantiate(ClientManager.instance.GetClientSettings().networkedObjects[objectData.index], objectData.position, objectData.rotation, false, objectData.fromId); }
void ReceivePackage(NetPeer peer, NetPacketReader reader, DeliveryMethod deliveryMethod) { NetDataWriter writer = new NetDataWriter(); ushort msgid = reader.GetUShort(); print("receivepackage event: " + msgid); switch (msgid) { case 1: //register to host { RegisterPlayer(reader); } break; case 101: //create networkObject { int objectId; int lobjectId = reader.GetUShort(); ObjectData objectData = reader.GetBytesWithLength().ToStructure <ObjectData>(); do { objectId = UnityEngine.Random.Range(1000000, 9999999); } while (NetworkObjects.ContainsKey(objectId)); objectData.objectId = objectId; var netObj = new NetworkObjectData(objectId, objectData); NetworkObjects.Add(objectId, netObj); netObj.SendObjectData(peer, writer); writer.Put(lobjectId); client.SendToAll(writer, DeliveryMethod.ReliableOrdered); } break; } }
// 送信要求 public void send(NetworkObjectData nod) { // 送信内容をキューイングして、後でまとめて送信する send_fifo.Enqueue(nod); }
// データ受信 void OnReceiveEvent(NetworkObjectData nod) { ulong id = nod.getGlobalId(); GameObject go = null; if (object_dict_.ContainsKey(id)) { // 過去に出現したことがある // 情報更新のみ go = object_dict_[id]; var nobj = go.GetComponent<NetworkObject>(); nobj.setRemoteData(nod); } else { // 初めて登場する // 生成 GameObject prefab = null; string name = ""; switch (nod.type) { case NetworkObjectData.Type.Player: prefab = player_prefab_; name = "player_"; break; case NetworkObjectData.Type.Block: prefab = block_prefab_; name = "block_"; break; } if (prefab != null) { go = Instantiate(prefab, nod.position, nod.rotation) as GameObject; go.name = name + nod.getName(); var nobj = go.GetComponent<NetworkObject>(); nobj.isLocal = false; object_dict_[id] = go; nobj.spawnRemote(nod); } } if (go != null) { var nobj = go.GetComponent<NetworkObject>(); nobj.latestUpdate = Time.time; } }
// 出現時の処理 public abstract void spawnRemote(NetworkObjectData nod);
// 受信したリモートデータを設定 public void setRemoteData(NetworkObjectData nod) { sharedNod = nod; }