您的位置:首页 > 产品设计 > UI/UE

UGUI_界面拖动和焦点界面

2016-03-09 19:40 357 查看
UGUI_界面拖动和焦点界面

一般软件和游戏有多窗口多界面时,都可以拖动子界面和排序子界面【点击后变成焦点界面显示在最前面】。如下图:



UGUI的官方例子中有实现拖动的脚本DragPanel,不过它没支持界面排序,加个排序很简单,在按下鼠标时调用tranform的SetSiblingIndex即可,值越大越靠前,在这里我只是简单的实现了这个基本功能,最终用到项目是需要设计一下的,因为很多时候需要记录打开界面的一些信息,在这里就不多说了。

代码:

using UnityEngine;  
using UnityEngine.UI;  
using UnityEngine.EventSystems;  
using System.Collections;  
  
public class DragPanel : MonoBehaviour, IPointerDownHandler, IDragHandler {  
      
    // 鼠标起点  
    private Vector2 originalLocalPointerPosition;     
    // 面板起点  
    private Vector3 originalPanelLocalPosition;  
    // 当前面板  
    private RectTransform panelRectTransform;  
    // 父节点,这个最好是UI父节点,因为它的矩形大小刚好是屏幕大小  
    private RectTransform parentRectTransform;  
  
    private static int siblingIndex = 0;  
    void Awake () {  
        panelRectTransform = transform.parent as RectTransform;  
        parentRectTransform = panelRectTransform.parent as RectTransform;  
    }  
      
    // 鼠标按下  
    public void OnPointerDown (PointerEventData data) {  
        siblingIndex++;  
        panelRectTransform.transform.SetSiblingIndex(siblingIndex);  
        // 记录当前面板起点  
        originalPanelLocalPosition = panelRectTransform.localPosition;  
        // 通过屏幕中的鼠标点,获取在父节点中的鼠标点  
        // parentRectTransform:父节点  
        // data.position:当前鼠标位置  
        // data.pressEventCamera:当前事件的摄像机  
        // originalLocalPointerPosition:获取当前鼠标起点  
        RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition);  
    }  
    // 拖动  
    public void OnDrag (PointerEventData data) {  
        if (panelRectTransform == null || parentRectTransform == null)  
            return;  
        Vector2 localPointerPosition;  
        // 获取本地鼠标位置  
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out localPointerPosition)) {  
            // 移动位置 = 本地鼠标当前位置 - 本地鼠标起点位置  
            Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;  
            // 当前面板位置 = 面板起点 + 移动位置  
            panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal;  
        }  
        ClampToWindow ();  
    }  
      
    // 限制当前面板在父节点中的区域位置  
    void ClampToWindow () {  
        // 面板位置  
        Vector3 pos = panelRectTransform.localPosition;  
  
        // 如果是UI父节点,设置面板大小为0,那么最大最小位置为正负屏幕的一半  
        Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min;  
        Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max;  
  
        pos.x = Mathf.Clamp (panelRectTransform.localPosition.x, minPosition.x, maxPosition.x);  
        pos.y = Mathf.Clamp (panelRectTransform.localPosition.y, minPosition.y, maxPosition.y);  
          
        panelRectTransform.localPosition = pos;  
    }  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: