Unity编辑器中分割线拖拽的实现

本文介绍了一个Unity编辑器窗口的自定义GUI组件——GUISplitter,它允许用户通过拖动来调整两个视图之间的分割位置。组件使用了GUILayout进行布局,并监听鼠标事件以实现拖动效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using UnityEngine;
 using UnityEditor;

 public class GUISplitter : EditorWindow {
     Vector2 posLeft;
     Vector2 posRight;
     GUIStyle styleLeftView;
     GUIStyle styleRightView;
     float splitterPos;
     Rect splitterRect;
     Vector2 dragStartPos;
     bool dragging;
     float splitterWidth = 5;

     // Add menu named "My Window" to the Window menu
     [MenuItem ("GUI/GUISplitter")]
     static void Init () {
            GUISplitter window = (GUISplitter)EditorWindow.GetWindow (
                typeof (GUISplitter));
         window.position = new Rect(200, 200, 200,200);
         window.splitterPos = 100;
     }

     void OnGUI (){
         if (styleLeftView == null)
             styleLeftView = new GUIStyle(GUI.skin.box);
         if (styleRightView == null)
             styleRightView = new GUIStyle(GUI.skin.button);

         GUILayout.BeginHorizontal ();

         // Left view
         posLeft = GUILayout.BeginScrollView (posLeft,
             GUILayout.Width (splitterPos),
             GUILayout.MaxWidth(splitterPos),
             GUILayout.MinWidth(splitterPos));
             GUILayout.Box ("Left View",
                     styleLeftView,
                     GUILayout.ExpandWidth(true),
                     GUILayout.ExpandHeight(true));
         GUILayout.EndScrollView ();

         // Splitter
         GUILayout.Box ("",
             GUILayout.Width(splitterWidth),
             GUILayout.MaxWidth (splitterWidth),
             GUILayout.MinWidth(splitterWidth),
             GUILayout.ExpandHeight(true));
         splitterRect = GUILayoutUtility.GetLastRect ();

         // Right view
         posRight = GUILayout.BeginScrollView (posRight,
             GUILayout.ExpandWidth(true));
             GUILayout.Box ("Right View",
             styleRightView,
             GUILayout.ExpandWidth(true),
             GUILayout.ExpandHeight(true));
         GUILayout.EndScrollView ();

         GUILayout.EndHorizontal ();

         // Splitter events
         if (Event.current != null) {
             switch (Event.current.rawType) {
                 case EventType.MouseDown:
                     if (splitterRect.Contains (Event.current.mousePosition)) {
                         Debug.Log ("Start dragging");
                         dragging = true;
                     }
                     break;
                 case EventType.MouseDrag:
                     if (dragging){
                         Debug.Log ("moving splitter");
                         splitterPos += Event.current.delta.x;
                         Repaint ();
                     }
                     break;
                 case EventType.MouseUp:
                     if (dragging){
                         Debug.Log ("Done dragging");
                         dragging = false;
                     }
                     break;
             }
         }
     }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值