using UnityEngine; using UnityEditor; using System.Collections.Generic; using System.Linq; using System; public partial class AbilityEditorWindow { private void DrawAbilityCreation() { EditorGUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Create New Ability", EditorStyles.boldLabel); DrawAbilityTypeSelection(); if (selectedAbilityType != null) { DrawBasicFields(); DrawTypeSpecificFields(); EditorGUILayout.Space(10); if (GUILayout.Button("Create Ability")) { CreateAbility(); } } EditorGUILayout.EndVertical(); } private void DrawAbilityTypeSelection() { EditorGUILayout.Space(10); EditorGUILayout.LabelField("Ability Type", EditorStyles.boldLabel); string[] typeNames = abilityTypes.Keys.ToArray(); int currentIndex = Array.IndexOf(typeNames, selectedAbilityType?.Name ?? ""); int newIndex = EditorGUILayout.Popup("Select Type", currentIndex, typeNames); if (newIndex != currentIndex && newIndex >= 0) { selectedAbilityType = abilityTypes[typeNames[newIndex]]; abilityData.typeSpecificData.Clear(); } } private void DrawBasicFields() { EditorGUILayout.Space(10); EditorGUILayout.LabelField("Basic Settings", EditorStyles.boldLabel); abilityData.name = EditorGUILayout.TextField("Name", abilityData.name); abilityData.description = EditorGUILayout.TextArea(abilityData.description, GUILayout.Height(60)); abilityData.icon = (Sprite)EditorGUILayout.ObjectField("Icon", abilityData.icon, typeof(Sprite), false); abilityData.animationType = (AbilityAnimationType)EditorGUILayout.EnumPopup("Animation Type", abilityData.animationType); EditorGUILayout.Space(5); EditorGUILayout.LabelField("Costs and Timing", EditorStyles.boldLabel); abilityData.manaCost = EditorGUILayout.FloatField("Mana Cost", abilityData.manaCost); abilityData.healthCost = EditorGUILayout.FloatField("Health Cost", abilityData.healthCost); abilityData.cooldown = EditorGUILayout.FloatField("Cooldown", abilityData.cooldown); abilityData.castTime = EditorGUILayout.FloatField("Cast Time", abilityData.castTime); abilityData.castableWhileMoving = EditorGUILayout.Toggle("Castable While Moving", abilityData.castableWhileMoving); } private void DrawTypeSpecificFields() { if (selectedAbilityType == null) return; EditorGUILayout.Space(10); EditorGUILayout.LabelField("Type Specific Settings", EditorStyles.boldLabel); if (selectedAbilityType == typeof(ProjectileAbility)) { DrawProjectileFields(); } else if (selectedAbilityType == typeof(AreaOfEffectAbility)) { DrawAreaOfEffectFields(); } else if (selectedAbilityType == typeof(ChanneledAbility)) { DrawChanneledFields(); } } private void DrawProjectileFields() { float projectileSpeed = abilityData.GetOrCreateTypeSpecific("projectileSpeed"); projectileSpeed = EditorGUILayout.FloatField("Projectile Speed", projectileSpeed); abilityData.typeSpecificData["projectileSpeed"] = projectileSpeed; float lifeSpan = abilityData.GetOrCreateTypeSpecific("lifeSpan"); lifeSpan = EditorGUILayout.FloatField("Life Span", lifeSpan); abilityData.typeSpecificData["lifeSpan"] = lifeSpan; bool canPierce = abilityData.GetOrCreateTypeSpecific("canPierce"); canPierce = EditorGUILayout.Toggle("Can Pierce", canPierce); abilityData.typeSpecificData["canPierce"] = canPierce; GameObject projectilePrefab = abilityData.GetOrCreateTypeSpecific("projectilePrefab"); projectilePrefab = (GameObject)EditorGUILayout.ObjectField("Projectile Prefab", projectilePrefab, typeof(GameObject), false); abilityData.typeSpecificData["projectilePrefab"] = projectilePrefab; } private void DrawAreaOfEffectFields() { float radius = abilityData.GetOrCreateTypeSpecific("radius"); radius = EditorGUILayout.FloatField("Radius", radius); abilityData.typeSpecificData["radius"] = radius; float duration = abilityData.GetOrCreateTypeSpecific("duration"); duration = EditorGUILayout.FloatField("Duration", duration); abilityData.typeSpecificData["duration"] = duration; GameObject aoePrefab = abilityData.GetOrCreateTypeSpecific("aoePrefab"); aoePrefab = (GameObject)EditorGUILayout.ObjectField("AoE Prefab", aoePrefab, typeof(GameObject), false); abilityData.typeSpecificData["aoePrefab"] = aoePrefab; } private void DrawChanneledFields() { float channelDuration = abilityData.GetOrCreateTypeSpecific("channelDuration"); channelDuration = EditorGUILayout.FloatField("Channel Duration", channelDuration); abilityData.typeSpecificData["channelDuration"] = channelDuration; bool canMove = abilityData.GetOrCreateTypeSpecific("canMove"); canMove = EditorGUILayout.Toggle("Can Move While Channeling", canMove); abilityData.typeSpecificData["canMove"] = canMove; } }