protected void Update() { if (NetworkServer.Active && Time.time > _nextSendTime) { _nextSendTime = Time.time + 1f / SendRatePerSecond; int count = 0; if (_syncObjects.Count > 0) { _sequenceId++; foreach (IStateSynchronize obj in _syncObjects) { obj.CalculatePriority(); } _syncObjects.Sort((p, q) => q.Priority.CompareTo(p.Priority)); // Sorting by descinding order of priority //_syncObjects = _syncObjects.OrderBy(x => x.CalculatePriority()).ToList(); _stateSyncMessage.SequenceNumber = _sequenceId; List <StateUpdateMessage> stateUpdateMessageList = new List <StateUpdateMessage>(); foreach (IStateSynchronize obj in _syncObjects) { if (count > ObjectsSyncPerUpdate || obj.Priority == 0) { break; } count++; StateUpdateMessage stateUpdateMessage = new StateUpdateMessage(); stateUpdateMessage.SyncObject = obj.Prefab; stateUpdateMessage.Id = obj.UniqueId; stateUpdateMessage.Position = obj.Rigidbody.position; stateUpdateMessage.Rotation = obj.Rigidbody.rotation; stateUpdateMessage.IsMoving = obj.Rigidbody.IsSleeping(); stateUpdateMessage.LinearVelocity = obj.Rigidbody.velocity; stateUpdateMessage.AngularVelocity = obj.Rigidbody.angularVelocity; stateUpdateMessageList.Add(stateUpdateMessage); obj.Priority = 0; } _stateSyncMessage.NumberOfObjects = (ushort)stateUpdateMessageList.Count; _stateSyncMessage.Objects = stateUpdateMessageList.ToArray(); foreach (var connection in _connectedPlayers) { if (!Input.GetKey(KeyCode.Space)) { NetworkServer.SendToObservers(connection, _stateSyncMessage, 1); // 1 is unreliable } } } } if (NetworkClient.Active) { ProcessPacket(); } }
public StateUpdateMessage Copy() { StateUpdateMessage message = new StateUpdateMessage(); message.SyncObject = SyncObject; message.Id = Id; message.Position = Position; message.Rotation = Rotation; message.IsMoving = IsMoving; message.LinearVelocity = LinearVelocity; message.AngularVelocity = AngularVelocity; return(message); }
public void OnDeserialize(Reader reader) { SequenceNumber = reader.ReadUIntCompressed(); NumberOfObjects = reader.ReadUShort(); Objects = new StateUpdateMessage[NumberOfObjects]; for (int i = 0; i < NumberOfObjects; ++i) { Objects[i] = new StateUpdateMessage(); Objects[i].SyncObject = (SyncObject)reader.ReadByte(); Objects[i].Id = reader.ReadUShort(); Objects[i].Position = reader.ReadVector3Compressed(); Objects[i].Rotation = reader.ReadQuaternionCompressed(); Objects[i].IsMoving = reader.ReadBoolean(); // if (Objects[i].IsMoving) // { Objects[i].LinearVelocity = reader.ReadVector3Compressed(); Objects[i].AngularVelocity = reader.ReadVector3Compressed(); // } } }