#if UNITY_EDITOR using UnityEditor; using UnityEngine; namespace DamageVolumeSystem.Editor { [CustomEditor(typeof(DamageHost))] public class DamageHostEditor : UnityEditor.Editor { /* * Editor page created by Mountools * Author : WangSoul * Date : 2026 / 05 / 09 - 15:26:18 */ public DamageHost damageHost; private void OnEnable() { damageHost = (DamageHost) target; } private void DrawDamageHostEditor() { EditorGUILayout.HelpBox("这玩意用来绑在产生伤害或接收伤害的物体上的,绑上去就能接收事件了,但是具体伤害事件还得单独接入,不同物体有不同的接收伤害模式。", MessageType.Info); EditorGUILayout.LabelField("伤害组 ID,同 ID 的物体不会互相伤害"); DrawGroupButtons(ref damageHost.group, 12); EditorGUILayout.Space(); EditorGUILayout.HelpBox($"当前组内发现 {damageHost.generators.Count} 个伤害生成器,修改了一定要记得重新搜寻", MessageType.Info); EditorGUILayout.BeginHorizontal(); { if (GUILayout.Button("搜寻")) { damageHost.generators.Clear(); foreach (var generator in damageHost.gameObject.GetComponentsInChildren()) { damageHost.generators.Add(generator); generator.binding = damageHost; EditorUtility.SetDirty(generator); } } } EditorGUILayout.EndHorizontal();; EditorGUILayout.Space(); EditorGUILayout.HelpBox("这玩意是伤害事件,当有伤害发生时会执行,记得绑定", MessageType.Info); } private static void DrawGroupButtons(ref int groupValue, int buttonCount, int columns = 4) { for (int i = 0; i < buttonCount; i += columns) { EditorGUILayout.BeginHorizontal(); for (int j = 0; j < columns && i + j < buttonCount; j++) { int buttonValue = i + j; var color = GUI.backgroundColor; GUI.backgroundColor = (groupValue == buttonValue) ? new Color(0.51f, 0.69f, 1f) : color; if (GUILayout.Button(buttonValue.ToString(), GUILayout.Width(24))) { groupValue = buttonValue; } GUI.backgroundColor = color; } EditorGUILayout.EndHorizontal(); } } #region _ public override void OnInspectorGUI() { Undo.RecordObject(damageHost, "Edit DamageHost"); EditorGUI.BeginChangeCheck(); DrawDamageHostEditor(); DrawDefaultInspector(); if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(damageHost); Undo.FlushUndoRecordObjects(); serializedObject.ApplyModifiedProperties(); } } private bool Property(string label, string propertyName, params GUILayoutOption[] options) { return EditorGUILayout.PropertyField(serializedObject.FindProperty(propertyName), new GUIContent(label), options); } #endregion } } #endif