Files
Main/Assets/Editor/DIY/SkillEditor/EditorSkill.cs

138 lines
5.2 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using Thousandto.Code.Logic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEditor;
using UnityEngine;
namespace Thousandto.SkillEditor.DIY
{
//技能
public class EditorSkill
{
public EditorEntity Owner { get; private set; }
public SkillVisualInfo VisualInfo { get; private set; }
public List<SkillEditorBaseEvent> EventList { get; private set; }
public bool IsFinish { get; private set; }
public int CurFrame { get; private set; }
public float FrameTimer { get; private set; }
public const float OneFrameTime = 1f / 30f;
public EditorSkill(EditorEntity owner, SkillVisualInfo visualInfo)
{
Owner = owner;
VisualInfo = visualInfo;
EventList = new List<SkillEditorBaseEvent>(visualInfo.DataList.Count);
for (int i = 0; i < visualInfo.DataList.Count; ++i)
{
if (!visualInfo.DataList[i].IsEnable)
continue;
var newEvent = NewEvent(visualInfo.DataList[i]);
if (newEvent != null)
{
EventList.Add(newEvent);
}
}
EventList.Sort(SortEvent);
}
private int SortEvent(SkillEditorBaseEvent left, SkillEditorBaseEvent right)
{
return right.EventType.CompareTo(left.EventType);
}
public void Start()
{
IsFinish = false;
CurFrame = 0;
FrameTimer = 0f;
DoEvent(CurFrame);
}
public void Stop()
{
IsFinish = true;
for (int i = 0; i < EventList.Count; ++i)
{
EventList[i].Stop();
}
}
public void Update(float dt)
{
if (IsFinish)
return;
for (int i = 0; i < EventList.Count; ++i)
{
EventList[i].Update(dt);
}
FrameTimer += dt;
while (FrameTimer >= OneFrameTime)
{
++CurFrame;
FrameTimer -= OneFrameTime;
DoEvent(CurFrame);
}
if(CurFrame >= VisualInfo.FrameCount)
{
//技能结束
Stop();
}
}
private void DoEvent(int frame)
{
for (int i = 0; i < EventList.Count; ++i)
{
EventList[i].FrameUpdate(frame);
if(EventList[i].BaseEventInfo.EventFrame == frame)
{
EventList[i].Enter();
}
}
}
private SkillEditorBaseEvent NewEvent(SkillBaseEventInfo info)
{
switch (info.EventType)
{
case SkillEventDefine.PlayAnimation: //播放动作
return new EditorPlayAnimEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlayVfx: //播放特效
return new EditorPlayVfxEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlaySfx: //播放音效
return new EditorPlaySFXEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlayCameraShake: //播放摄像机震动
return new EditorPlayCameraShakeEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlayBlur: //播放辐射状模糊效果
return new EditorPlayBlurEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlaySlow: //播放减速效果
return new EditorPlaySlowEvent(VisualInfo, info, Owner);
case SkillEventDefine.DisableMove: //禁止角色移动事件
return new EditorDisableMoveEvent(VisualInfo, info, Owner);
case SkillEventDefine.DisableChangeDir: //禁止角色改变方向事件
return new EditorDisableChangeDirEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlayLockTrajectory: //播放锁定弹道
return new EditorPlayLockTrajectoryEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlaySimpleSkillObject: //播放简单召唤物
return new EditorPlaySimpleSkillObjectEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlaySkillObject: //播放技能召唤物
return new EditorPlaySkillObjectEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlayHit: //播放产生伤害事件
return new EditorPlayHitEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlaySelfMove: //播放自身移动事件
return new EditorPlaySelfMoveEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlayHideWeapon:
return new EditorPlayHideWeaponEvent(VisualInfo, info, Owner);
case SkillEventDefine.PlayLinkDamage:
return new EditorPlayLinkDamageEvent(VisualInfo, info, Owner);
}
return null;
}
}
}