using UnityEngine; using UnityEditor; using System.Collections.Generic; using System.Linq; using System; public partial class AbilityEffectEditorWindow { private void DrawEffectCreation() { EditorGUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Create New Effect", EditorStyles.boldLabel); DrawEffectTypeSelection(); if (selectedEffectType != null) { DrawEffectBasicFields(); DrawEffectTypeSpecificFields(); EditorGUILayout.Space(10); if (GUILayout.Button("Create Effect")) { CreateEffect(); } } EditorGUILayout.EndVertical(); } private void DrawEffectTypeSelection() { EditorGUILayout.Space(10); EditorGUILayout.LabelField("Effect Type", EditorStyles.boldLabel); string[] typeNames = effectTypes.Keys.ToArray(); int currentIndex = Array.IndexOf(typeNames, selectedEffectType?.Name ?? ""); int newIndex = EditorGUILayout.Popup("Select Type", currentIndex, typeNames); if (newIndex != currentIndex && newIndex >= 0) { selectedEffectType = effectTypes[typeNames[newIndex]]; effectData.typeSpecificData.Clear(); } } private void DrawEffectBasicFields() { EditorGUILayout.Space(10); EditorGUILayout.LabelField("Basic Settings", EditorStyles.boldLabel); effectData.name = EditorGUILayout.TextField("Name", effectData.name); effectData.description = EditorGUILayout.TextArea(effectData.description, GUILayout.Height(60)); EditorGUILayout.Space(5); EditorGUILayout.LabelField("Target Settings", EditorStyles.boldLabel); effectData.applyToTargetsHit = EditorGUILayout.Toggle("Apply To Targets Hit", effectData.applyToTargetsHit); effectData.applyToSelf = EditorGUILayout.Toggle("Apply To Self", effectData.applyToSelf); EditorGUILayout.Space(5); EditorGUILayout.LabelField("Duration Settings", EditorStyles.boldLabel); effectData.duration = EditorGUILayout.FloatField("Duration", effectData.duration); // Draw tags EditorGUILayout.Space(5); EditorGUILayout.LabelField("Tags", EditorStyles.boldLabel); DrawTagsList(effectData.tags); } private void DrawTagsList(List tags) { for (int i = 0; i < tags.Count; i++) { EditorGUILayout.BeginHorizontal(); tags[i] = (GameTag)EditorGUILayout.ObjectField(tags[i], typeof(GameTag), false); if (GUILayout.Button("Remove", GUILayout.Width(60))) { tags.RemoveAt(i); break; } EditorGUILayout.EndHorizontal(); } if (GUILayout.Button("Add Tag")) { tags.Add(null); } } private void DrawEffectTypeSpecificFields() { if (selectedEffectType == null) return; EditorGUILayout.Space(10); EditorGUILayout.LabelField("Type Specific Settings", EditorStyles.boldLabel); if (selectedEffectType == typeof(InstantValueEffect)) { DrawInstantValueEffectFields(); } else if (selectedEffectType == typeof(DamageOverTimeEffect)) { DrawDamageOverTimeEffectFields(); } else if (selectedEffectType == typeof(StatusEffect)) { DrawStatusEffectFields(); } } private void DrawInstantValueEffectFields() { float baseValue = effectData.GetOrCreateTypeSpecific("baseValue"); baseValue = EditorGUILayout.FloatField("Base Value", baseValue); effectData.typeSpecificData["baseValue"] = baseValue; DamageType damageType = effectData.GetOrCreateTypeSpecific("damageType"); damageType = (DamageType)EditorGUILayout.EnumPopup("Damage Type", damageType); effectData.typeSpecificData["damageType"] = damageType; float alliedMultiplier = effectData.GetOrCreateTypeSpecific("alliedMultiplier"); alliedMultiplier = EditorGUILayout.FloatField("Allied Target Multiplier", alliedMultiplier); effectData.typeSpecificData["alliedMultiplier"] = alliedMultiplier; float enemyMultiplier = effectData.GetOrCreateTypeSpecific("enemyMultiplier"); enemyMultiplier = EditorGUILayout.FloatField("Enemy Target Multiplier", enemyMultiplier); effectData.typeSpecificData["enemyMultiplier"] = enemyMultiplier; } private void DrawDamageOverTimeEffectFields() { float damagePerTick = effectData.GetOrCreateTypeSpecific("damagePerTick"); damagePerTick = EditorGUILayout.FloatField("Damage Per Tick", damagePerTick); effectData.typeSpecificData["damagePerTick"] = damagePerTick; float tickRate = effectData.GetOrCreateTypeSpecific("tickRate"); tickRate = EditorGUILayout.FloatField("Tick Rate", tickRate); effectData.typeSpecificData["tickRate"] = tickRate; DamageOverTimeType dotType = effectData.GetOrCreateTypeSpecific("dotType"); dotType = (DamageOverTimeType)EditorGUILayout.EnumPopup("DoT Type", dotType); effectData.typeSpecificData["dotType"] = dotType; } private void DrawStatusEffectFields() { EditorGUILayout.LabelField("Stat Influences", EditorStyles.boldLabel); DrawStatInfluencesList(effectData.GetOrCreateTypeSpecific>("statInfluences")); } private void DrawStatInfluencesList(List influences) { for (int i = 0; i < influences.Count; i++) { EditorGUILayout.BeginVertical("box"); influences[i].statTag = (GameTag)EditorGUILayout.ObjectField("Stat Tag", influences[i].statTag, typeof(GameTag), false); influences[i].percentInfluence = EditorGUILayout.FloatField("Percent Influence", influences[i].percentInfluence); if (GUILayout.Button("Remove Influence")) { influences.RemoveAt(i); break; } EditorGUILayout.EndVertical(); } if (GUILayout.Button("Add Stat Influence")) { influences.Add(new StatInfluence()); } } }