自定义Timeline工具1
效果
就是第1行绘制了一个工具栏,高度为17;
然后绘制了一个窗口分隔条,左侧用于放轨道,右侧用于放轨道片段,分隔条可以在一定范围内拖动。
public class MyTimelineWnd : EditorWindow { [MenuItem("MyTools/MyTimelineWnd", false, 1)] static void ShowWindow() { var win = GetWindow(typeof(MyTimelineWnd), false, "MyTimelineWnd"); win.minSize = new Vector2(500, 300); } private const float Toolbar_Height = 17; private const float Split_Left_Min_Size = 180; private const float Split_Left_Max_Size = 260; private readonly Color Color_Split = new Color(0.5f, 0.5f, 0.5f, 0.3f); private readonly Color Color_Tog_Play_On = new Color(30f / 255.0f, 144f / 255.0f, 255f / 255.0f, 1.0f); //steelBlue private MyGUIContents m_GuiContents; private bool m_SplitCickDown = false; private float m_SplitLeftWidth = 220; private bool m_IsPlaying = false; private int m_FrameRate = 30; void OnEnable() { if (null == m_GuiContents) m_GuiContents = new MyGUIContents(); } void OnGUI() { DrawToolbar(); DrawSplit(); } private void DrawToolbar() { GUILayout.BeginHorizontal(EditorStyles.toolbar); DrawToolbar_SplitLeft(); DrawToolbar_SplitRight(); GUILayout.EndHorizontal(); } private void DrawToolbar_SplitLeft() { GUILayout.BeginHorizontal(GUILayout.Width(m_SplitLeftWidth)); //第一帧 if (GUILayout.Button(m_GuiContents.Btn_FirstKey, EditorStyles.toolbarButton)) { //todo: } //上一帧 if (GUILayout.Button(m_GuiContents.Btn_LastKey, EditorStyles.toolbarButton)) { //todo: } //播放 bool isPlaying = false; if (m_IsPlaying) { var oldColor = GUI.color; GUI.color = Color_Tog_Play_On; isPlaying = GUILayout.Toggle(m_IsPlaying, m_GuiContents.Tog_Play, EditorStyles.toolbarButton); GUI.color = oldColor; } else { isPlaying = GUILayout.Toggle(m_IsPlaying, m_GuiContents.Tog_Play, EditorStyles.toolbarButton); } if (m_IsPlaying != isPlaying) { m_IsPlaying = isPlaying; //todo: } //下一帧 if (GUILayout.Button(m_GuiContents.Btn_NextKey, EditorStyles.toolbarButton)) { //todo: } //最后一帧 if (GUILayout.Button(m_GuiContents.Btn_LastKey, EditorStyles.toolbarButton)) { //todo: } GUILayout.Space(10); //当前在哪一帧 var rect = EditorGUILayout.GetControlRect(false, 30, EditorStyles.toolbarTextField, GUILayout.MinWidth(28)); EditorGUI.TextField(rect, "0", EditorStyles.toolbarTextField); GUILayout.EndHorizontal(); } private void DrawToolbar_SplitRight() { GUILayout.FlexibleSpace(); GUILayout.Label(m_GuiContents.Label_Duration); var r = EditorGUILayout.GetControlRect(false, 30, EditorStyles.toolbarTextField, GUILayout.MinWidth(28), GUILayout.MaxWidth(40)); EditorGUI.TextField(r, $"{m_FrameRate}", EditorStyles.toolbarTextField); if (GUILayout.Button(m_GuiContents.Btn_Popup, EditorStyles.toolbarButton)) { var menu = new GenericMenu(); GenericMenu.MenuFunction2 menuCall = (data) => { //todo m_FrameRate = (int)data; }; menu.AddItem(m_GuiContents.Frame_Rate_30, 30==m_FrameRate, menuCall, 30); menu.AddItem(m_GuiContents.Frame_Rate_50, 50==m_FrameRate, menuCall, 50); menu.AddItem(m_GuiContents.Frame_Rate60, 60==m_FrameRate, menuCall, 60); menu.ShowAsContext(); } } private void DrawSplit() { //分隔窗 var splitRect = new Rect(m_SplitLeftWidth, 0, 6, position.height); EditorGUIUtility.AddCursorRect(splitRect, MouseCursor.SplitResizeLeftRight); EditorGUI.DrawRect(splitRect, Color_Split); if (Event.current.type == EventType.MouseDown) { if (splitRect.Contains(Event.current.mousePosition)) m_SplitCickDown = true; } if (m_SplitCickDown) { if (Event.current.type == EventType.MouseDrag) { m_SplitLeftWidth += Event.current.delta.x; m_SplitLeftWidth = Mathf.Max(Split_Left_Min_Size, Mathf.Min(m_SplitLeftWidth, Split_Left_Max_Size)); Event.current.Use(); } else if (Event.current.type == EventType.MouseUp) { m_SplitCickDown = false; Event.current.Use(); //Debug.Log($"MouseUp: {Event.current.type}"); } } } }
class MyGUIContents { public readonly GUIContent Btn_FirstKey = EditorGUIUtility.TrIconContent("Animation.FirstKey"); public readonly GUIContent Btn_PrevKey = EditorGUIUtility.TrIconContent("Animation.PrevKey"); public readonly GUIContent Tog_Play = EditorGUIUtility.TrIconContent("Animation.Play"); public readonly GUIContent Btn_NextKey = EditorGUIUtility.TrIconContent("Animation.NextKey"); public readonly GUIContent Btn_LastKey = EditorGUIUtility.TrIconContent("Animation.LastKey"); public readonly GUIContent Btn_Popup = EditorGUIUtility.TrIconContent("_Popup"); public readonly GUIContent Label_Duration = new GUIContent("duration:"); public readonly GUIContent Frame_Rate_30 = new GUIContent("Frame Rate 30"); public readonly GUIContent Frame_Rate_50 = new GUIContent("Frame Rate 50"); public readonly GUIContent Frame_Rate60 = new GUIContent("Frame Rate 60"); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2023-05-23 _MainTex_ST表示
2023-05-23 用于Blinn-Phong光照模型的半角向量可视化工具