private void OnMessInstantiate(MessageInstantiate message) { Debug.Log("Создан объект ID:" + message.netID); NetGO netGO; //проверяем наш ли это объект if (message.owner == StaticLinks.clientData.myId) { //ищем в коллекции несинхронизированных объектов тот который успешно создался netGO = netGOsNoSync.Where(x => x.localId == message.localId).FirstOrDefault(); //если почему то не нашли то выходим if (netGO == null) { return; } //если всетаки нашли то инициализируем, и переводим в правильный список netGO.isMy = true; //помечаем что он наш netGOsNoSync.Remove(netGO); // Удаляем его из временного списка } else { //а если он не наш, то просто создаем его netGO = GameObject.Instantiate <NetGO>(Resources.Load <NetGO>(message.name.Split(new char[] { ' ', '(' })[0])); netGO.isMy = false; netGO.transform.position = message.position.Vector3(); netGO.transform.rotation = message.rotation.Quaternion(); } netGO.netID = message.netID; netGO.sync = true; //помечаем что объект синхронизирован с сервером netGOs.Add(netGO.netID, netGO); // Добавляем в нормальный словарь }
public void NetInstantiate(NetGO netGO) { MessageInstantiate message = new MessageInstantiate(); message.name = netGO.name; message.localId = GetNewLocalId(); message.position = netGO.transform.position.NetworkVector3(); message.rotation = netGO.transform.rotation.NetworkQuaternion(); netGO.localId = message.localId; GalaxyApi.send.SendMessageToServer((byte)CommandType.goInstantiate, message, GalaxyCoreCommon.GalaxyDeliveryType.reliable); netGOsNoSync.Add(netGO); }
/// <summary> /// Обработчик создания новых объектов /// </summary> /// <param name="message"></param> /// <param name="clientConnection"></param> void InstantiateGO(MessageInstantiate message, ClientConnection clientConnection) { Client client = Server.clientManager.GetClientByConnection(clientConnection); NetGO netGO = new NetGO(); netGO.name = message.name; netGO.netID = GetNewID(); netGO.owner = client.id; netGO.position = message.position; netGO.rotation = message.rotation; message.netID = netGO.netID; message.owner = client.id; netObjects.Add(netGO.netID, netGO); SendMessageToAll((byte)CommandType.goInstantiate, message, GalaxyDeliveryType.reliable); Console.WriteLine("Был создан NetGO id:" + netGO.netID); }
/// <summary> /// В этот метод приходят все входящии сообщения (мы на них подписались) /// </summary> /// <param name="code"></param> /// <param name="data"></param> private void OnGalaxyIncommingMessage(byte code, byte[] data) { switch ((CommandType)code) { case CommandType.goInstantiate: { MessageInstantiate message = MessageInstantiate.Deserialize <MessageInstantiate>(data); OnMessInstantiate?.Invoke(message); } break; case CommandType.goTransform: { MessageTransform message = MessageTransform.Deserialize <MessageTransform>(data); OnMessTransform?.Invoke(message); } break; case CommandType.goDestroy: { MessageDestroyGO message = MessageDestroyGO.Deserialize <MessageDestroyGO>(data); OnMessDestroy?.Invoke(message); } break; case CommandType.worldSync: { MessageWorldSync message = MessageWorldSync.Deserialize <MessageWorldSync>(data); OnWorldSync?.Invoke(message); } break; case CommandType.goMessage: { MessageGO message = MessageGO.Deserialize <MessageGO>(data); OnGoMessage?.Invoke(message); } break; } }
/// <summary> /// Отправка текущего состояния мира /// </summary> private void SendWorld(ClientConnection clientConnection) { NetGO[] netGOs = netObjects.Values.ToArray(); // берем все наши сетевые объекты if (netGOs.Length == 0) { return; //раз нет сетевых объектов то выходим } MessageWorldSync message = new MessageWorldSync(); message.netObjects = new List <MessageInstantiate>(); foreach (var item in netGOs) { MessageInstantiate instantiate = new MessageInstantiate(); instantiate.name = item.name; instantiate.netID = item.netID; instantiate.owner = item.owner; instantiate.position = item.position; instantiate.rotation = item.rotation; message.netObjects.Add(instantiate); } clientConnection.SendMessage((byte)CommandType.worldSync, message, GalaxyDeliveryType.reliable); }
/// <summary> /// Сюда попадают проброшенные сообщения /// </summary> /// <param name="code"></param> /// <param name="data"></param> /// <param name="clientConnection"></param> public override void TossMessage(byte code, byte[] data, ClientConnection clientConnection) { switch ((CommandType)code) { case CommandType.goInstantiate: { MessageInstantiate message = MessageInstantiate.Deserialize <MessageInstantiate>(data); InstantiateGO(message, clientConnection); } break; case CommandType.goTransform: { MessageTransform message = MessageTransform.Deserialize <MessageTransform>(data); TransformGO(message, clientConnection); } break; case CommandType.goDestroy: { MessageDestroyGO message = MessageDestroyGO.Deserialize <MessageDestroyGO>(data); DestroyGO(message, clientConnection); } break; case CommandType.worldSync: { SendWorld(clientConnection); } break; case CommandType.goMessage: { SendMessageToAllExcept(clientConnection, (byte)CommandType.goMessage, data, GalaxyDeliveryType.reliable); } break; } }