private void FixedUpdate() { // If this is a client store and send the current polled input for processing if (!networkObject.IsServer) { _frameNumber++; // Only send the input if it has buttons pressed or has changed from the previous input state if (_inputFrame != null && (_inputFrame.HasInput || _lastInputFrame == null || _inputFrame != _lastInputFrame)) { _inputFrame.frameNumber = _frameNumber; if (networkObject.IsOwner) { _framesToSend.Add(_inputFrame); FramesToPlay.Add(_inputFrame); FramesToReconcile.Add(_inputFrame); } } // Send the input(s) if needed // I added an option to use the frame sync rate and send a List or // send every input and only send InputFrames if (_framesToSend.Count > 0 && (sendSingleInputs || _frameNumber % frameSyncRate == 0)) { byte[] bytes = {}; if (sendSingleInputs) { bytes = ByteArrayUtilities.ObjectToByteArray(_framesToSend[0]); } else { bytes = ByteArrayUtilities.ObjectToByteArray(_framesToSend); } networkObject.SendRpc(RPC_SYNC_INPUTS, Receivers.Server, new object[] { bytes }); if (sendSingleInputs) { _framesToSend.RemoveAt(0); } else { _framesToSend.Clear(); } } } }
// RPC for receiving InputFrames from the clients public override void SyncInputs(RpcArgs args) { if (networkObject.IsServer) { var bytes = args.GetNext <Byte[]>(); if (sendSingleInputs) { InputFrame nextInputFrame = (InputFrame)ByteArrayUtilities.ByteArrayToObject(bytes); FramesToPlay.Add(nextInputFrame); } else { List <InputFrame> networkInputFrames = (List <InputFrame>)ByteArrayUtilities.ByteArrayToObject(bytes); FramesToPlay.AddRange(networkInputFrames); } } }