Files
Main/Assets/Plugins/Code/Cinematic/CinematicKeyframe.cs
2025-01-25 04:38:09 +08:00

221 lines
6.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using System;
using System.IO;
namespace Thousandto.Cinematic
{
//关键帧对象
[Serializable]
public class CinematicKeyframe : ICinematic
{
public int Keyframe;
public List<CinematicEventData> EventData;
//下一个位移点占整个曲线的百分比
public float TransPercentageInCurve;
[NonSerialized]
public bool Selected;
[NonSerialized]
public bool HasSyncTrans;
[NonSerialized]
public CinematicKeyframe PreEventData;
[NonSerialized]
public CinematicKeyframe NextKeyframe;
[NonSerialized]
public CinematicKeyframe NextTransKeyframe; //下一个包含位移的关键帧,可能会跳过多帧
[NonSerialized]
public Action<bool> RefreshCallback;
[NonSerialized]
public CinematicEventData AnimEvent;
[NonSerialized]
public CinematicEventData TransformEvent;
[NonSerialized]
public bool NeedSetPositionNow = true;
public override void WriteAll(BinaryWriter bw)
{
PrepareWriter(bw);
WriteInt(Keyframe);
WriteList(EventData);
WriteFloat(TransPercentageInCurve);
}
public override void ReadAll(BinaryReader rd)
{
PrepareReader(rd);
Keyframe = ReadInt();
EventData = ReadList<CinematicEventData>();
TransPercentageInCurve = ReadFloat();
}
public CinematicKeyframe()
{
Selected = false;
Keyframe = -1;
EventData = new List<CinematicEventData>();
}
public void SetData(int frame)
{
Keyframe = frame;
EventData = new List<CinematicEventData>();
OnRefreshEditor();
}
public void SetData(int frame, List<CinematicEventData> eData)
{
Keyframe = frame;
EventData = eData;
for(int i = 0; i < eData.Count; ++i)
{
if(eData[i].EventTypeEx == KeyFrameEvent.)
{
TransformEvent = eData[i];
}
if(eData[i].EventTypeEx == KeyFrameEvent.)
{
AnimEvent = eData[i];
}
}
OnRefreshEditor();
}
public void AddEvent(CinematicEventData eData)
{
if (eData.EventTypeEx == KeyFrameEvent.)
{
TransformEvent = eData;
}
if (eData.EventTypeEx == KeyFrameEvent.)
{
AnimEvent = eData;
}
EventData.Add(eData);
OnRefreshEditor();
}
public void RemoveEvent(int index)
{
if(EventData.Count > index)
{
var forRemove = EventData[index];
EventData.RemoveAt(index);
if(forRemove.EventTypeEx == KeyFrameEvent.)
{
TransformEvent = null;
}
if(forRemove.EventTypeEx == KeyFrameEvent.)
{
AnimEvent = null;
}
}
OnRefreshEditor();
}
public void RemoveTransEventWhileHasSyncEvent()
{
bool hasSyncEvent = false;
int transEventIndex = -1;
for(int i = 0; i < EventData.Count; ++i)
{
if(EventData[i].EventTypeEx == KeyFrameEvent. ||
EventData[i].EventTypeEx == KeyFrameEvent.)
{
if (!hasSyncEvent && transEventIndex != -1)
{
EventData.RemoveAt(transEventIndex);
i--;
}
hasSyncEvent = true;
}
if(EventData[i].EventTypeEx == KeyFrameEvent.)
{
if (hasSyncEvent)
EventData.RemoveAt(i--);
else
transEventIndex = i;
}
}
}
//当有数据改变时通知CinematicKeyframeEditor刷新数据, 参数为true时销毁对象
public void OnRefreshEditor(bool destroy = false)
{
if (RefreshCallback != null) RefreshCallback(destroy);
}
public void SetSelected()
{
if (Keyframe >= 0)
Selected = true;
else
Selected = false;
}
public CinematicEventData GetTransEvent()
{
for(int i = 0; i < EventData.Count; ++i)
{
if (EventData[i].EventTypeEx == KeyFrameEvent.) return TransformEvent = EventData[i];
}
return null;
}
public CinematicEventData GetAnimEvent()
{
for (int i = 0; i < EventData.Count; ++i)
{
if (EventData[i].EventTypeEx == KeyFrameEvent.) return AnimEvent = EventData[i];
}
return null;
}
public List<CinematicEventData> CloneEventData()
{
List<CinematicEventData> eData = new List<CinematicEventData>();
for(int i = 0; i < EventData.Count; ++i)
{
eData.Add(EventData[i].Clone());
}
return eData;
}
[NonSerialized]
private CinematicEventData _syncTransEvent;
public CinematicEventData GetSyncTransEvent()
{
if (_syncTransEvent == null)
{
for (int i = 0; i < EventData.Count; ++i)
{
if (EventData[i].EventTypeEx == KeyFrameEvent. ||
EventData[i].EventTypeEx == KeyFrameEvent.)
{
_syncTransEvent = EventData[i];
}
}
}
return _syncTransEvent;
}
}
}