NLDClient-yudde/ProjectNLD/Assets/Editor/SkillEditor/Handlers/PlayEffectHandler.cs

143 lines
5.1 KiB
C#

using UnityEngine;
using UnityEditor;
using System;
using System.Linq;
using Framework;
using Gameplay.Skill;
namespace SkillEditor
{
public class PlayEffectHandler : BaseSkillActionHandler
{
private readonly string[] _effectIdNames;
private string[] _filterEffectIdNames;
private string _effectSearchKey = string.Empty;
private int _selectEffectIndex;
public PlayEffectHandler()
{
// 初始化特效列表
var effectStrList = EditorTableManager.instance.tables.EffectConfig.DataList
.Select(effect =>
{
var prefabPath = effect.PrefabPath;
var fileName = prefabPath;
return $"{effect.RoleID}_{fileName}";
})
.ToList();
effectStrList.Insert(0, "0_无效ID");
_effectIdNames = effectStrList.ToArray();
_filterEffectIdNames = _effectIdNames;
}
private void UpdateEffectSearch(string newSearchKey, SkillActionClip clip)
{
if (newSearchKey == _effectSearchKey) return;
_effectSearchKey = newSearchKey;
if (string.IsNullOrEmpty(newSearchKey))
{
_filterEffectIdNames = _effectIdNames;
}
else
{
_filterEffectIdNames = _effectIdNames.Where(name => name.Contains(newSearchKey)).ToArray();
}
_selectEffectIndex = -1;
// 根据id重定向index
if (_filterEffectIdNames.Length > 0)
{
var effectId = clip.intId;
if (EditorTableManager.instance.tables.EffectConfig.DataMap.TryGetValue(effectId, out var effectConfig))
{
var prefabPath = effectConfig.PrefabPath;
var fileName = prefabPath;
var combineName = $"{effectConfig.RoleID}_{fileName}";
_selectEffectIndex = Array.IndexOf(_filterEffectIdNames, combineName);
}
}
}
private void HandleEffectSelection(SkillActionClip clip)
{
var newEffectIndex = EditorGUILayout.Popup("特效:", _selectEffectIndex, _filterEffectIdNames);
if (newEffectIndex != _selectEffectIndex)
{
_selectEffectIndex = newEffectIndex;
var effectId = 0;
if (_selectEffectIndex > -1)
{
effectId = int.Parse(_filterEffectIdNames[_selectEffectIndex].Split('_')[0]);
}
clip.intId = effectId;
}
}
private void HandleFlyLineSettings(SkillActionClip clip)
{
clip.intParam1 = EditorGUILayout.Popup("飞行类型:", clip.intParam1, SkillEditorConfig.FlyLineTypes);
switch (clip.intParam1)
{
case 0: // 直线
break;
case 1: // 抛物线
clip.floatParam2 = EditorGUILayout.FloatField("抛物线高度:", clip.floatParam2);
clip.floatParam3 = EditorGUILayout.FloatField("抛物线中点:", clip.floatParam3);
break;
default:
ShowErrorMessage($"无效的飞行类型:{clip.intParam1}");
break;
}
}
public override void HandleAction(SkillActionClip clip)
{
if (clip == null)
{
ShowErrorMessage("无效的技能逻辑");
return;
}
DrawWarningLabel("如果没有想要的特效,需要先去Effect表中进行配置");
// 特效子类型选择
var newEffectSubTypeIndex = EditorGUILayout.Popup("特效子类型:", clip.intSubType, SkillEditorConfig.EffectSubTypes);
if (newEffectSubTypeIndex != clip.intSubType)
{
clip.intSubType = newEffectSubTypeIndex;
}
// 处理飞行类型特效的特殊设置
bool hasFlyLine = false;
switch (clip.intSubType)
{
case ESkillEffectPosType.WeaponFireFly2Target:
case ESkillEffectPosType.LeftHand2Target:
case ESkillEffectPosType.RightHand2Target:
if (clip.floatParam1 == 0f)
{
clip.floatParam1 = 0.1f;
}
clip.floatParam1 = EditorGUILayout.FloatField("飞行时间:", clip.floatParam1);
hasFlyLine = true;
break;
}
if (hasFlyLine)
{
HandleFlyLineSettings(clip);
}
// 特效搜索和选择
var newSearchKey = EditorGUILayout.TextField("搜索:", _effectSearchKey);
UpdateEffectSearch(newSearchKey, clip);
DrawCenteredLabel($"共有 {_filterEffectIdNames.Length} 个相关项", SkillEditorConfig.WarningTextColor);
HandleEffectSelection(clip);
}
}
}