前言
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层级原则的都明白。