134 lines
5.4 KiB
C#
134 lines
5.4 KiB
C#
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<float>("projectileSpeed");
|
|
projectileSpeed = EditorGUILayout.FloatField("Projectile Speed", projectileSpeed);
|
|
abilityData.typeSpecificData["projectileSpeed"] = projectileSpeed;
|
|
|
|
float lifeSpan = abilityData.GetOrCreateTypeSpecific<float>("lifeSpan");
|
|
lifeSpan = EditorGUILayout.FloatField("Life Span", lifeSpan);
|
|
abilityData.typeSpecificData["lifeSpan"] = lifeSpan;
|
|
|
|
bool canPierce = abilityData.GetOrCreateTypeSpecific<bool>("canPierce");
|
|
canPierce = EditorGUILayout.Toggle("Can Pierce", canPierce);
|
|
abilityData.typeSpecificData["canPierce"] = canPierce;
|
|
|
|
GameObject projectilePrefab = abilityData.GetOrCreateTypeSpecific<GameObject>("projectilePrefab");
|
|
projectilePrefab = (GameObject)EditorGUILayout.ObjectField("Projectile Prefab",
|
|
projectilePrefab, typeof(GameObject), false);
|
|
abilityData.typeSpecificData["projectilePrefab"] = projectilePrefab;
|
|
}
|
|
|
|
private void DrawAreaOfEffectFields()
|
|
{
|
|
float radius = abilityData.GetOrCreateTypeSpecific<float>("radius");
|
|
radius = EditorGUILayout.FloatField("Radius", radius);
|
|
abilityData.typeSpecificData["radius"] = radius;
|
|
|
|
float duration = abilityData.GetOrCreateTypeSpecific<float>("duration");
|
|
duration = EditorGUILayout.FloatField("Duration", duration);
|
|
abilityData.typeSpecificData["duration"] = duration;
|
|
|
|
GameObject aoePrefab = abilityData.GetOrCreateTypeSpecific<GameObject>("aoePrefab");
|
|
aoePrefab = (GameObject)EditorGUILayout.ObjectField("AoE Prefab",
|
|
aoePrefab, typeof(GameObject), false);
|
|
abilityData.typeSpecificData["aoePrefab"] = aoePrefab;
|
|
}
|
|
|
|
private void DrawChanneledFields()
|
|
{
|
|
float channelDuration = abilityData.GetOrCreateTypeSpecific<float>("channelDuration");
|
|
channelDuration = EditorGUILayout.FloatField("Channel Duration", channelDuration);
|
|
abilityData.typeSpecificData["channelDuration"] = channelDuration;
|
|
|
|
bool canMove = abilityData.GetOrCreateTypeSpecific<bool>("canMove");
|
|
canMove = EditorGUILayout.Toggle("Can Move While Channeling", canMove);
|
|
abilityData.typeSpecificData["canMove"] = canMove;
|
|
}
|
|
}
|