using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System; using System.Text.RegularExpressions; using System.Threading; public class NetPackageWindow : EditorWindow { public static NetPackageWindow window = null; [UnityEditor.MenuItem("程序/封包查看工具 &1")] static void Init() { window = GetWindow(typeof(NetPackageWindow), false, "封包查看工具") as NetPackageWindow; window.Show(); window.autoRepaintOnSceneChange = true; } static int MAX_PACKAGE_COUNT = 200; private Vector2 scrollPosition; string stopRecBtnDetail = "暂停接收包"; bool professionalSkin; string filterNetPkgStr; private string simSendPkgDetail = ""; NetPackagetType m_CurrentType = NetPackagetType.All; bool reveralFilter; bool showHeartPackage; int maxShowPackageCount; bool threading = true; List m_DrawPackages = new List(); List drawPackages { get { lock (this) { return m_DrawPackages; } } set { lock (this) { m_DrawPackages = value; } } } private void OnDisable() { threading = false; LocalSave.SetBool("NetPackageSkinPattern", professionalSkin); LocalSave.SetInt("NetPackageShowMaxCount", maxShowPackageCount); LocalSave.SetString("NetPkgToolFilterNetPackageString", filterNetPkgStr); LocalSave.SetBool("NetPkgToolFilterNetPackageReveralFilter", reveralFilter); } private void OnEnable() { professionalSkin = LocalSave.GetBool("NetPackageSkinPattern", false); maxShowPackageCount = LocalSave.GetInt("NetPackageShowMaxCount", 100); filterNetPkgStr = LocalSave.GetString("NetPkgToolFilterNetPackageString"); reveralFilter = LocalSave.GetBool("NetPkgToolFilterNetPackageReveralFilter", false); var thread = new Thread(OnThreading); thread.IsBackground = true; thread.Start(); } public void CheckPackageShowState(NetPackage package) { if (m_CurrentType != NetPackagetType.All && m_CurrentType != package.type) { package.show = false; return; } if (!showHeartPackage && Regex.IsMatch(package.name, ".*(OnlineReturn|ServerHeart|OnlineReply).*")) { package.show = false; return; } if (!string.IsNullOrEmpty(filterNetPkgStr)) { var contain = false; try { contain = Regex.IsMatch(package.name, StringUtility.Contact(".*(", filterNetPkgStr.Replace(" ", "|"), ").*")); } catch (System.Exception ex) { } if (reveralFilter && contain) { package.show = false; return; } else if (!reveralFilter && !contain) { package.show = false; return; } } package.show = true; } private void OnThreading() { while (threading) { var packages = NetPkgCtl.GetPackages(); if (packages != null) { var showCount = 0; for (int i = packages.Count - 1; i >= 0; i--) { if (packages[i] == null) { packages.RemoveAt(i); continue; } showCount++; if (showCount >= maxShowPackageCount) { break; } CheckPackageShowState(packages[i]); } } Thread.Sleep(50); } } void OnGUI() { GUI.skin.customStyles[1].alignment = TextAnchor.UpperLeft; GUI.skin.customStyles[1].fontStyle = FontStyle.Normal; GUI.skin.customStyles[1].fixedWidth = 450; GUI.skin.button.normal.textColor = professionalSkin ? Color.white : Color.black; GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); professionalSkin = !GUILayout.Toggle(!professionalSkin, "普通皮肤"); professionalSkin = GUILayout.Toggle(professionalSkin, "高级皮肤"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); maxShowPackageCount = EditorGUILayout.IntField("最大显示封包数:", maxShowPackageCount); showHeartPackage = GUILayout.Toggle(showHeartPackage, "心跳包"); m_CurrentType = GUILayout.Toggle(m_CurrentType == NetPackagetType.All, "全部") ? NetPackagetType.All : m_CurrentType; m_CurrentType = GUILayout.Toggle(m_CurrentType == NetPackagetType.Server, "收包") ? NetPackagetType.Server : m_CurrentType; m_CurrentType = GUILayout.Toggle(m_CurrentType == NetPackagetType.Client, "发包") ? NetPackagetType.Client : m_CurrentType; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); filterNetPkgStr = EditorGUILayout.TextField("关键字", filterNetPkgStr); reveralFilter = GUILayout.Toggle(reveralFilter, "反向过滤"); GUILayout.EndHorizontal(); SimSendPkg(); scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, false); var packages = NetPkgCtl.GetPackages(); if (packages != null) { var count = 0; for (int i = packages.Count - 1; i >= 0; i--) { var package = packages[i]; if (package != null) { count++; } if (count >= maxShowPackageCount) { break; } if (package.show) { try { EditorGUILayout.BeginHorizontal(); if (professionalSkin) { GUI.skin.button.normal.textColor = package.type == NetPackagetType.Client ? Color.yellow : Color.white; } else { GUI.skin.button.normal.textColor = package.type == NetPackagetType.Client ? Color.blue : Color.black; } if (GUILayout.Button(package.type == NetPackagetType.Client ? "CS" : "SC", GUILayout.Width(30))) { PackageDetailsWindow.packageTime = package.time; PackageDetailsWindow.packageName = package.name; PackageDetailsWindow.packageBytes = package.content; PackageDetailsWindow.packageDetails = package.fieldDetails; } GUI.skin.button.normal.textColor = professionalSkin ? Color.white : Color.black; var showName = StringUtility.Contact(package.time, " ", package.name); EditorGUILayout.LabelField(showName, GUILayout.Width(260)); EditorGUILayout.TextField(package.fields); EditorGUILayout.EndHorizontal(); } catch (Exception ex) { } } } } GUILayout.EndScrollView(); GUILayout.BeginHorizontal(); if (GUILayout.Button(stopRecBtnDetail)) { NetPkgCtl.stopRecieve = !NetPkgCtl.stopRecieve; if (NetPkgCtl.stopRecieve) { stopRecBtnDetail = "开始接收包"; } else { List tempNetPkgLst = NetPkgCtl.GetTempPackages(); if (packages != null) { packages.AddRange(tempNetPkgLst); while (packages.Count > MAX_PACKAGE_COUNT) { packages.RemoveAt(0); } } tempNetPkgLst.Clear(); stopRecBtnDetail = "暂停接收包"; } } if (GUILayout.Button("打印摘要")) { NetPkgCtl.WriteAllNetLog(false); } if (GUILayout.Button("打印详情")) { NetPkgCtl.WriteAllNetLog(true); } if (GUILayout.Button("清除")) { if (NetPkgCtl.GetPackages() != null) { NetPkgCtl.GetPackages().Clear(); } } GUILayout.EndHorizontal(); GUILayout.EndVertical(); } private void SimSendPkg() { GUILayout.BeginHorizontal(); simSendPkgDetail = EditorGUILayout.TextField("模拟发包内容:", simSendPkgDetail); if (GUILayout.Button("模拟发包")) { string sendPkgDetail = simSendPkgDetail.Replace(" ", ""); if (sendPkgDetail.Length % 2 != 0) { sendPkgDetail += " "; } byte[] sendBytes = new byte[sendPkgDetail.Length / 2]; for (int i = 0; i < sendBytes.Length; i++) { sendBytes[i] = Convert.ToByte(sendPkgDetail.Substring(i * 2, 2), 16); } GameNetSystem.Instance.SendInfo(sendBytes); } GUILayout.EndHorizontal(); } private string NetPkgTypeString() { switch (m_CurrentType) { case NetPackagetType.All: return "全部"; case NetPackagetType.Server: return "收包"; case NetPackagetType.Client: return "发包"; default: return "全部"; } } } public enum FilterType { Filter = 0, ReverFilter = 1, }