using UnityEngine; using UnityEditor; using System.Collections.Generic; using System.Linq; using System; public partial class AbilityEffectEditorWindow { private void DrawExistingEffects() { EditorGUILayout.LabelField("Existing Effects", EditorStyles.boldLabel); var effects = GetAllEffects(); foreach (var effect in effects) { if (string.IsNullOrEmpty(searchQuery) || effect.name.ToLower().Contains(searchQuery.ToLower())) { EditorGUILayout.BeginVertical("box"); DrawEffectItem(effect); EditorGUILayout.EndVertical(); } } } private void DrawEffectItem(BaseEffect effect) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField(effect.name, EditorStyles.boldLabel); EditorGUILayout.LabelField($"Type: {effect.GetType().Name}"); EditorGUILayout.EndVertical(); if (GUILayout.Button("Clone", GUILayout.Width(50))) { CloneEffect(effect); } if (GUILayout.Button("Edit", GUILayout.Width(50))) { Selection.activeObject = effect; EditorUtility.FocusProjectWindow(); } EditorGUILayout.EndHorizontal(); } private void CreateEffect() { if (selectedEffectType == null) { EditorUtility.DisplayDialog("Error", "Please select an effect type!", "OK"); return; } if (string.IsNullOrEmpty(effectData.name)) { EditorUtility.DisplayDialog("Error", "Effect name cannot be empty!", "OK"); return; } BaseEffect effect = (BaseEffect)CreateInstance(selectedEffectType); effect.name = effectData.name; effect.tags = new List(effectData.tags); // Apply type-specific data ApplyEffectTypeSpecificData(effect); string path = EditorUtility.SaveFilePanelInProject( "Save Effect", effectData.name, "asset", "Save effect asset" ); if (!string.IsNullOrEmpty(path)) { AssetDatabase.CreateAsset(effect, path); AssetDatabase.SaveAssets(); EditorUtility.FocusProjectWindow(); Selection.activeObject = effect; effectData = new EffectCreationData(); selectedEffectType = null; } } private void CloneEffect(BaseEffect sourceEffect) { string newName = $"{sourceEffect.name}_Clone"; string path = EditorUtility.SaveFilePanelInProject( "Save Cloned Effect", newName, "asset", "Save cloned effect asset" ); if (string.IsNullOrEmpty(path)) return; BaseEffect newEffect = (BaseEffect)CreateInstance(sourceEffect.GetType()); EditorUtility.CopySerialized(sourceEffect, newEffect); newEffect.name = newName; AssetDatabase.CreateAsset(newEffect, path); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); EditorUtility.FocusProjectWindow(); Selection.activeObject = newEffect; } private void ApplyEffectTypeSpecificData(BaseEffect effect) { if (effect is InstantValueEffect instantEffect) { instantEffect.baseValue = effectData.GetOrCreateTypeSpecific("baseValue"); instantEffect.damageType = effectData.GetOrCreateTypeSpecific("damageType"); instantEffect.AlliedTargetMultiplier = effectData.GetOrCreateTypeSpecific("alliedMultiplier"); instantEffect.EnemyTargetMultiplier = effectData.GetOrCreateTypeSpecific("enemyMultiplier"); } else if (effect is DamageOverTimeEffect dotEffect) { dotEffect.baseDamagePerTick = effectData.GetOrCreateTypeSpecific("damagePerTick"); dotEffect.tickRate = effectData.GetOrCreateTypeSpecific("tickRate"); dotEffect.damageType = effectData.GetOrCreateTypeSpecific("dotType"); } else if (effect is StatusEffect statusEffect) { statusEffect.duration = effectData.duration; statusEffect.applyToTargetsHit = effectData.applyToTargetsHit; statusEffect.applyToSelf = effectData.applyToSelf; List influences = effectData.GetOrCreateTypeSpecific>("statInfluences"); statusEffect.influencingStats = new List(influences); } } private BaseEffect[] GetAllEffects() { return AssetDatabase.FindAssets("t:BaseEffect") .Select(guid => AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid))) .ToArray(); } }