143 lines
5.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|