void HandleDataEvent(int channelId, byte[] buffer, int length) { var lastIndex = length - 1; m_NetworkReader.SeekZero(); MessageHandlerDelegate handler; while (m_NetworkReader.Position < lastIndex) { m_NetworkReader.Lock(HEADER_BYTE_COUNT); // the reader passed to user code has a copy of bytes from the real stream. user code never touches the real stream. // this ensures it can never get out of sync if user code reads less or more than the real amount. ushort msgSize = m_NetworkReader.ReadUInt16(); ushort msgType = m_NetworkReader.ReadUInt16(); #if NETWORK_DEBUGGER_ENABLED UnityEngine.Debug.Log($"{DEBUGGING_NAME} Incoming : MsgType:{msgType}, ChannelId:{channelId} Size:{msgSize}"); #endif #if NETWORK_PROFILER_ENABLED && UNITY_EDITOR var profilerName = new StringBuilder(DEBUGGING_NAME); profilerName.Append(msgType); NetworkProfiler.RecordMessageIncoming(profilerName.ToString(), msgSize); #endif m_NetworkReader.Lock((ushort)(msgSize - HEADER_BYTE_COUNT)); if (m_Handlers.TryGetValue(msgType, out handler)) { handler.Invoke(m_ClientPeer.Connection, m_NetworkReader); } else { UnityEngine.Debug.LogWarning($"Unknown message ID {msgType} from channel:{channelId}"); } m_NetworkReader.CheckReading(); } }