public override void Process(float sequencerTime, float playbackRate) { float prevElapsedTime = elapsedTime; elapsedTime = sequencerTime; for (int i = 0; i < EventTracks.Count; i++) { JEventTrack track = EventTracks[i]; JEventBase[] events = track.EventClips.ToArray(); if (prevElapsedTime < elapsedTime) { Array.Sort(events, delegate(JEventBase a, JEventBase b) { return(a.StartTime.CompareTo(b.StartTime)); }); } else { Array.Sort(events, delegate(JEventBase a, JEventBase b) { return(b.StartTime.CompareTo(a.StartTime)); }); } foreach (JEventBase baseEvent in events) { if (playbackRate >= 0.0f) { FireEvent(baseEvent, prevElapsedTime, elapsedTime); } else { FireEventReverse(baseEvent, prevElapsedTime, elapsedTime); } FireEventCommon(baseEvent, sequencerTime, prevElapsedTime, elapsedTime); } } }
private GenericMenu MenuForEventTimeLine(JTimelineBase line, JEventTrack track) { GenericMenu contextMenu = new GenericMenu(); float newTime = (((UnityEngine.Event.current.mousePosition.x + XScroll) / DisplayArea.width) * line.Sequence.Duration) / XScale; contextMenu.AddItem(new GUIContent("AddNewEventTimeline"), false, (obj) => AddNewEventTrack(((JTimelineBase)((object[])obj)[0])), new object[] { line }); string baseAdd = "Add Event/"; var baseType = typeof(JEventBase); var types = USEditorUtility.GetAllSubTypes(baseType).Where(type => type.IsSubclassOf(baseType)); foreach (Type type in types) { string fullAdd = baseAdd; var customAttributes = type.GetCustomAttributes(true).Where(attr => attr is JEventAttribute).Cast <JEventAttribute>(); foreach (JEventAttribute customAttribute in customAttributes) { fullAdd += customAttribute.EventPath; } contextMenu.AddItem(new GUIContent(fullAdd), false, (obj) => AddNewTrackEvent(((JEventTrack)((object[])obj)[0]), ((float)((object[])obj)[1]), ((Type)((object[])obj)[2])), new object[] { track, newTime, type }); } contextMenu.AddItem(new GUIContent("DeleteEventLine"), false, (obj) => RemoveEventTrack(((JEventTrack)((object[])obj)[0])), new object[] { track }); return(contextMenu); }
public override void SkipTimelineTo(float time) { for (int i = 0; i < EventTracks.Count; i++) { JEventTrack track = EventTracks[i]; JEventBase[] events = track.EventClips.ToArray(); float prevElapsedTime = elapsedTime; elapsedTime = time; foreach (JEventBase baseEvent in events) { if (!baseEvent) { continue; } bool shouldSkipEvent = !baseEvent.IsFireOneShotEvent || !baseEvent.FireOnSkip; if (shouldSkipEvent) { continue; } if ((prevElapsedTime < baseEvent.StartTime || prevElapsedTime <= 0.0f) && time > baseEvent.StartTime) { if (Sequence.IsPlaying && baseEvent.AffectedObject) { baseEvent.FireEvent(); } } } } }
private void AddRenderDataForEvent(JTimelineBase timeline) { if (timeline is JTimelineEvent) { JTimelineEvent tline = (JTimelineEvent)timeline; for (int k = 0; k < tline.EventTracks.Count; k++) { List <JClipRenderData> list = new List <JClipRenderData>(); JEventTrack track = tline.EventTracks[k]; for (int l = 0; l < track.EventClips.Count; l++) { JEventBase key = track.EventClips[l]; var cachedData = ScriptableObject.CreateInstance <JClipRenderData>(); cachedData.ClipData = key; list.Add(cachedData); } if (!timelineClipRenderDataMap.ContainsKey(track)) { timelineClipRenderDataMap.Add(track, list); } else { timelineClipRenderDataMap[track] = list; } } } }
public override void PauseTimeline() { for (int i = 0; i < EventTracks.Count; i++) { JEventTrack track = EventTracks[i]; JEventBase[] events = track.EventClips.ToArray(); foreach (JEventBase eventBase in events) { eventBase.PauseEvent(); } } }
public override void ResumeTimeline() { for (int i = 0; i < EventTracks.Count; i++) { JEventTrack track = EventTracks[i]; JEventBase[] events = track.EventClips.ToArray(); foreach (JEventBase eventBase in events) { if (!eventBase.IsFireOneShotEvent && Sequence.RunningTime > eventBase.StartTime && Sequence.RunningTime < (eventBase.StartTime + eventBase.Duration)) { eventBase.ResumeEvent(); } } } }
public override void StopTimeline() { float prevElapsedTime = elapsedTime; elapsedTime = 0.0f; for (int i = 0; i < EventTracks.Count; i++) { JEventTrack track = EventTracks[i]; JEventBase[] events = track.EventClips.ToArray(); events = events.Where(e => e.StartTime <= prevElapsedTime).ToArray(); for (int j = events.Length - 1; j >= 0; j--) { events[j].StopEvent(); } } }
private void RemoveEvent(JClipRenderData renderdata) { var keyframe = renderdata.ClipData; if (keyframe is JEventBase) { JEventBase key = (JEventBase)keyframe; JEventTrack track = key.Track; if (timelineClipRenderDataMap.ContainsKey(track)) { if (timelineClipRenderDataMap[track].Contains(renderdata)) { timelineClipRenderDataMap[track].Remove(renderdata); } } track.RemoveClip(key); } }
private void RemoveEventTrack(JEventTrack track) { if (timelineClipRenderDataMap.ContainsKey(track)) { timelineClipRenderDataMap.Remove(track); } JTimelineEvent line = (JTimelineEvent)track.TimeLine; line.RemoveTrack(track); JTimelineContainer contain = line.TimelineContainer; if (line.EventTracks.Count == 0) { DestroyImmediate(line.gameObject); } //删除的是最后一个 删除掉container if (contain.transform.childCount == 0) { DestroyImmediate(contain.gameObject); } }
//添加关键帧 private void AddNewTrackEvent(JEventTrack track, float time, Type eventType) { var clipData = ScriptableObject.CreateInstance(eventType) as JEventBase; clipData.StartTime = time; clipData.Track = track; clipData.EventName = eventType.Name; track.AddClip(clipData); if (timelineClipRenderDataMap.ContainsKey(track)) { var cachedData = ScriptableObject.CreateInstance <JClipRenderData>(); cachedData.ClipData = clipData; timelineClipRenderDataMap[track].Add(cachedData); } else { var cachedData = ScriptableObject.CreateInstance <JClipRenderData>(); cachedData.ClipData = clipData; List <JClipRenderData> list = new List <JClipRenderData>(); list.Add(cachedData); timelineClipRenderDataMap.Add(track, list); } }
public void RemoveTrack(JEventTrack tTrack) { EventTracks.Remove(tTrack); }
public void AddTrack(JEventTrack ttrack) { ttrack.TimeLine = this; EventTracks.Add(ttrack); }
private void EventGUI(JTimelineEvent Eventine, JEventTrack linetrack, JClipRenderData[] renderDataList) { GenericMenu contextMenu = new GenericMenu(); ///event 右键点击 bool isContext = UnityEngine.Event.current.type == EventType.MouseDown && UnityEngine.Event.current.button == 1; bool isChoose = UnityEngine.Event.current.type == EventType.MouseDown && UnityEngine.Event.current.button == 0 && UnityEngine.Event.current.clickCount == 1; bool hasBox = false; Rect DisplayAreaTemp = DisplayArea; DisplayAreaTemp.x = 0; DisplayAreaTemp.y = 0; for (int j = 0; j < renderDataList.Length; j++) { JClipRenderData renderdata = renderDataList[j]; JEventBase eventClipData = (JEventBase)renderdata.ClipData; JEventTrack track = eventClipData.Track; if (linetrack != track) { continue; } var startX = ConvertTimeToXPos(eventClipData.StartTime); var endX = ConvertTimeToXPos(eventClipData.StartTime + eventClipData.Duration); if (eventClipData.IsFireOneShotEvent) { endX = ConvertTimeToXPos(eventClipData.StartTime + 1f); } var handleWidth = 2.0f; float posy = DisplayArea.y; float height = DisplayArea.height; Rect renderRect = new Rect(startX, posy, endX - startX, height); Rect leftHandle = new Rect(startX, posy, handleWidth * 2.0f, height); Rect rightHandle = new Rect(endX - (handleWidth * 2.0f), posy, handleWidth * 2.0f, height); Rect labelRect = new Rect(); Rect renderRecttemp = renderRect; renderRecttemp.x -= DisplayArea.x; renderRecttemp.y = 0; Rect leftHandletemp = leftHandle; leftHandletemp.y = 0; leftHandletemp.x -= DisplayArea.x; Rect rightHandletemp = rightHandle; rightHandletemp.x -= DisplayArea.x; rightHandletemp.y = 0; GUI.color = new Color(144 / 255.0f, 234 / 255.0f, 251 / 255.0f, 1); if (SelectedObjects.Contains(renderdata)) { GUI.color = ColorTools.SelectColor; } GUI.Box(renderRecttemp, "", USEditorUtility.NormalWhiteOutLineBG); GUI.Box(leftHandletemp, ""); GUI.Box(rightHandletemp, ""); labelRect = renderRecttemp; renderdata.renderRect = renderRect; renderdata.labelRect = renderRect; renderdata.renderPosition = new Vector2(startX, height); renderdata.leftHandle = leftHandle; renderdata.rightHandle = rightHandle; renderdata.ClipData = eventClipData; labelRect.x += 4.0f; // Nudge this along a bit so it isn't flush with the side. GUI.color = Color.black; GUI.Label(labelRect, eventClipData.EventName); GUI.color = Color.white; if (isContext && renderRecttemp.Contains(UnityEngine.Event.current.mousePosition)) { hasBox = true; contextMenu.AddItem(new GUIContent("DeleteEvent"), false, (obj) => RemoveEvent(((JClipRenderData)((object[])obj)[0])), new object[] { renderdata }); } if (isContext && renderRecttemp.Contains(UnityEngine.Event.current.mousePosition)) { UnityEngine.Event.current.Use(); contextMenu.ShowAsContext(); } } if (!hasBox && isChoose && DisplayAreaTemp.Contains(UnityEngine.Event.current.mousePosition) && (UnityEngine.Event.current.control || UnityEngine.Event.current.command)) { //代码选中hierarchy中的对象 显示inspector 按住Ctrl or command //GameObject go = GameObject.Find(Animationline.gameObject.name); Selection.activeGameObject = Eventine.gameObject; EditorGUIUtility.PingObject(Eventine.gameObject); } if (!hasBox && isContext && DisplayAreaTemp.Contains(UnityEngine.Event.current.mousePosition)) { contextMenu = MenuForEventTimeLine(Eventine, linetrack); } if (!hasBox && isContext && DisplayAreaTemp.Contains(UnityEngine.Event.current.mousePosition)) { UnityEngine.Event.current.Use(); contextMenu.ShowAsContext(); } }