#if UNITY_EDITOR using UnityEditor; using UnityEngine; using BaseGames.Combat; namespace BaseGames.Editor { /// /// HurtBox 运行时注入状态可视化面板。 /// 通过 HurtBox 上的 Editor* 属性读取注入状态,以颜色区分是否注入成功。 /// 绿色 = 注入完成;橙色 = 未注入(该能力静默不生效);灰色 = 非 PlayMode。 /// [CustomEditor(typeof(HurtBox))] public class HurtBoxEditor : UnityEditor.Editor { // (属性访问器, 标签, 缺席说明) private static readonly (System.Func getter, string label, string absentNote)[] _fields = { (hb => hb.EditorOwner, "Owner (IDamageable)", "— 注入失败,ReceiveDamage 将无效"), (hb => hb.EditorShieldable, "Shieldable", "— 未注入(玩家专属,敌人无需)"), (hb => hb.EditorParrySystem, "ParrySystem", "— 未注入(弹反静默不生效)"), (hb => hb.EditorPoiseSource, "PoiseSource", "— 未注入(霸体静默不生效)"), (hb => hb.EditorStatusEffectable, "StatusEffectable", "— 未注入(状态效果静默不生效)"), }; public override void OnInspectorGUI() { DrawDefaultInspector(); EditorGUILayout.Space(4); EditorGUILayout.LabelField("── 运行时注入状态 ──", EditorStyles.boldLabel); if (!Application.isPlaying) { EditorGUILayout.HelpBox("进入 PlayMode 后查看注入状态。", MessageType.Info); return; } var hurtBox = (HurtBox)target; foreach (var (getter, label, absentNote) in _fields) { var value = getter(hurtBox); bool present = value != null; var savedColor = GUI.contentColor; GUI.contentColor = present ? new Color(0.3f, 0.9f, 0.4f) // 绿 : new Color(1.0f, 0.6f, 0.1f); // 橙 string displayValue = present ? $"✓ {value.GetType().Name}" : $"✗ null {absentNote}"; EditorGUILayout.LabelField(label, displayValue); GUI.contentColor = savedColor; } // 持续刷新(避免只显示初始状态) if (Application.isPlaying) Repaint(); } } } #endif