using System.Collections.Generic; using System; using System.IO; namespace Thousandto.Cinematic { //关键帧对象 [Serializable] public class CinematicKeyframe : ICinematic { public int Keyframe; public List 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 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(); TransPercentageInCurve = ReadFloat(); } public CinematicKeyframe() { Selected = false; Keyframe = -1; EventData = new List(); } public void SetData(int frame) { Keyframe = frame; EventData = new List(); OnRefreshEditor(); } public void SetData(int frame, List 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 CloneEventData() { List eData = new List(); 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; } } }