using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using Gameplay.Buff; using Gameplay.Common; using Gameplay.Common.Attri; using Gameplay.Level; using Gameplay.Unit; using UnityEditor; using UnityEngine; namespace FightDebug { public class FightDebugWindow : EditorWindow { [MenuItem("Tools/*战斗信息Debug/FightDebugWindow")] public static void ShowWindow() { var win = GetWindow("FightDebugWindow"); win.Show(); } private Vector2 _dragScrollPos; private void OnGUI() { if (LevelManager.Instance == null || LevelManager.Instance.CurrentLevel == null || !LevelManager.Instance.CurrentLevel.isInBattle) { GUILayout.Label("需要开始战斗后才能使用"); return; } var units = GameUnitManager.instance.infightUnits; _dragScrollPos = GUILayout.BeginScrollView(_dragScrollPos); GUILayout.BeginHorizontal(); for (int i = 0; i < units.count; i++) { var unit = units.GetByIndex(i); GUILayout.BeginVertical(); _DisplayUnit(unit); GUILayout.EndVertical(); } GUILayout.EndHorizontal(); GUILayout.EndScrollView(); } private void _DisplayUnit(GameUnit unit) { GUILayout.Label("unit id:" + unit.GetID()); // 获取对象的类型 var type = unit.GetType(); // 获取对象的所有字段 var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); for (int i = 0; i < fields.Length; i++) { var field = fields[i]; // 获取MyAttribute特性 var attribute = (FightDebugAttribute)Attribute.GetCustomAttribute(field, typeof(FightDebugAttribute)); if (attribute == null) { continue; } var displayName = attribute.displayName ?? field.Name; GUILayout.Label(displayName); _DisplayFiled(field, unit, 1); } // 单独展示bufflist var buffList = unit.buffManager.totalBuffList; for (int i = 0; i < buffList.Count; i++) { var buff = buffList[i]; _DisplayBuff(buff); } } private void _DisplayBuff(BaseBuff buff) { GUILayout.Label("buff id:" + buff.configData.ID); GUILayout.Label("buff 名字:" + buff.configData.Name); } private void _DisplayStructField(FieldInfo field, object obj, int indent = 0) { var notShow = (HideFightDebugAttribute)Attribute.GetCustomAttribute(field, typeof(HideFightDebugAttribute)); if (notShow != null) { return; } GUILayout.BeginHorizontal(); var value = field.GetValue(obj); GUILayout.Space(indent * 10); var attribute = (FightDebugAttribute)Attribute.GetCustomAttribute(field, typeof(FightDebugAttribute)); var displayName = attribute is { displayName: not null } ? attribute.displayName : field.Name; GUILayout.Label(displayName); GUILayout.Space(10); GUILayout.Label(value.ToString()); GUILayout.EndHorizontal(); } private void _DisplayList(object obj, int indent) { var listItemType = obj.GetType(); if (listItemType.IsClass) { var listItemFields = listItemType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); for (var i = 0; i < listItemFields.Length; ++i) { var subField = listItemFields[i]; if (subField.FieldType.IsClass) { var attribute = (FightDebugAttribute)Attribute.GetCustomAttribute(subField, typeof(FightDebugAttribute)); if (attribute == null) { continue; } var displayName = attribute.displayName ?? subField.Name; GUILayout.Label(displayName); _DisplayFiled(subField, obj, indent + 1); } else { // 值类型 _DisplayStructField(subField, obj, indent + 1); } } } else { GUILayout.Label(obj + ""); } } private void _DisplayFiled(FieldInfo field, object obj, int indent = 0) { var value = field.GetValue(obj); if (field.FieldType.IsClass) { var fields = field.FieldType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); for (int i = 0; i < fields.Length; i++) { var subField = fields[i]; if (subField.FieldType.IsClass) { var attribute = (FightDebugAttribute)Attribute.GetCustomAttribute(subField, typeof(FightDebugAttribute)); if (attribute == null) { continue; } var displayName = attribute.displayName ?? subField.Name; GUILayout.Label(displayName); // list单独做展示 if (subField.FieldType.IsGenericType && subField.FieldType.GetGenericTypeDefinition() == typeof(List<>)) { // 获取字段的值 var list = (IList)subField.GetValue(value); for (int j = 0; j < list.Count; j++) { var subValue = list[j]; _DisplayList(subValue, indent + 1); } } else { _DisplayFiled(subField, value, indent + 1); } } else { // 值类型 _DisplayStructField(subField, value, indent + 1); } } } else { _DisplayStructField(field, value, indent); } } } }