Unity3d C#实现UGUI的界面可拖拽移动和选中置顶等功能(含工程源码)

前言

UI元素可拖动的功能,可以使UI操作更开放,在和3D场景结合密切的UI界面需求更多,依托现在Unity3d的强大的UGUI系统可以很轻松的实现该功能。

效果

拖拽功能:
在这里插入图片描述

选中置顶:

在这里插入图片描述

实现

我们依托于EventTrigger组件,根据拖拽的事件(StartDrag,Draging等)和鼠标点击事件进行相关的界面的位置同步处理即可实现该功能。

测试UI搭建

按如下图搭建:

在这里插入图片描述

添加事件函数

 private void AddETEvent(EventTrigger et, EventTriggerType ei, UnityAction<BaseEventData> ua)
 {
    
    
     UnityAction<BaseEventData> action = ua;
     EventTrigger.Entry entry = new EventTrigger.Entry();
     entry.eventID = ei;
     entry.callback.AddListener(action);
     et.triggers.Add(entry);
}

该函数将事件类型(EventTriggerType ) 和事件动作 与 EventTrigger 组件进行绑定。

动态绑定事件

AddETEvent(et, EventTriggerType.BeginDrag, StartDrag);
AddETEvent(et, EventTriggerType.Drag, Draging);
AddETEvent(et, EventTriggerType.PointerDown, PointerDown);

这里进行了BeginDrag、Drag和PointerDown事件的绑定,在Awake或者Start的时候绑定即可。如果不用脚本绑定的话,就需要手动来绑定,这种就比较麻烦。

开始拖动处理

    private void StartDrag(BaseEventData data)
    {
    
    
        initObjPos = transform.GetComponent<RectTransform>().localPosition;
        initMousePos = Input.mousePosition;
    }

在按下鼠标并拖动时即开始拖动时(StartDrag),我们记录鼠标位置和节点的位置,后续需要根据此进行偏移移动。

拖动中处理

    private void Draging(BaseEventData data)
    {
    
    
        Vector3 temp = Input.mousePosition - initMousePos;
        transform.GetComponent<RectTransform>().localPosition = initObjPos + temp;
    }

拖动中的处理是根据当前鼠标位置,来动态改变界面位置。

选中操作处理

    private void PointerDown(BaseEventData data)
    {
    
    
        if (IsTopShow)
            transform.SetAsLastSibling();
    }

鼠标在界面上按下时(PointerDown),判断是否要置顶,置顶则将节点次序移动到最后。注意的是置顶功能在兄弟节点时才是完美这支持,这个应该知道UGUI层级原则的都明白。

工程源码

https://download.csdn.net/download/qq_33789001/20685639

猜你喜欢

转载自blog.csdn.net/qq_33789001/article/details/119345591
今日推荐