144 lines
4.8 KiB
C#
144 lines
4.8 KiB
C#
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<GameTag>(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<float>("baseValue");
|
|
instantEffect.damageType = effectData.GetOrCreateTypeSpecific<DamageType>("damageType");
|
|
instantEffect.AlliedTargetMultiplier = effectData.GetOrCreateTypeSpecific<float>("alliedMultiplier");
|
|
instantEffect.EnemyTargetMultiplier = effectData.GetOrCreateTypeSpecific<float>("enemyMultiplier");
|
|
}
|
|
else if (effect is DamageOverTimeEffect dotEffect)
|
|
{
|
|
dotEffect.baseDamagePerTick = effectData.GetOrCreateTypeSpecific<float>("damagePerTick");
|
|
dotEffect.tickRate = effectData.GetOrCreateTypeSpecific<float>("tickRate");
|
|
dotEffect.damageType = effectData.GetOrCreateTypeSpecific<DamageOverTimeType>("dotType");
|
|
}
|
|
else if (effect is StatusEffect statusEffect)
|
|
{
|
|
statusEffect.duration = effectData.duration;
|
|
statusEffect.applyToTargetsHit = effectData.applyToTargetsHit;
|
|
statusEffect.applyToSelf = effectData.applyToSelf;
|
|
|
|
List<StatInfluence> influences = effectData.GetOrCreateTypeSpecific<List<StatInfluence>>("statInfluences");
|
|
statusEffect.influencingStats = new List<StatInfluence>(influences);
|
|
}
|
|
}
|
|
|
|
private BaseEffect[] GetAllEffects()
|
|
{
|
|
return AssetDatabase.FindAssets("t:BaseEffect")
|
|
.Select(guid => AssetDatabase.LoadAssetAtPath<BaseEffect>(AssetDatabase.GUIDToAssetPath(guid)))
|
|
.ToArray();
|
|
}
|
|
}
|