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); } } }