• UGUI(七)界面拖动和焦点界面


    http://blog.sina.com.cn/s/blog_89d90b7c0102vj9e.html

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


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

    代码如下:

    1. using UnityEngine;  
    2. using UnityEngine.UI;  
    3. using UnityEngine.EventSystems;  
    4. using System.Collections;  
    5.   
    6. public class DragPanel : MonoBehaviour, IPointerDownHandler, IDragHandler {  
    7.       
    8.     // 鼠标起点  
    9.     private Vector2 originalLocalPointerPosition;     
    10.     // 面板起点  
    11.     private Vector3 originalPanelLocalPosition;  
    12.     // 当前面板  
    13.     private RectTransform panelRectTransform;  
    14.     // 父节点,这个最好是UI父节点,因为它的矩形大小刚好是屏幕大小  
    15.     private RectTransform parentRectTransform;  
    16.   
    17.     private static int siblingIndex = 0;  
    18.     void Awake () {  
    19.         panelRectTransform = transform.parent as RectTransform;  
    20.         parentRectTransform = panelRectTransform.parent as RectTransform;  
    21.     }  
    22.       
    23.     // 鼠标按下  
    24.     public void OnPointerDown (PointerEventData data) {  
    25.         siblingIndex++;  
    26.         panelRectTransform.transform.SetSiblingIndex(siblingIndex);  
    27.         // 记录当前面板起点  
    28.         originalPanelLocalPosition = panelRectTransform.localPosition;  
    29.         // 通过屏幕中的鼠标点,获取在父节点中的鼠标点  
    30.         // parentRectTransform:父节点  
    31.         // data.position:当前鼠标位置  
    32.         // data.pressEventCamera:当前事件的摄像机  
    33.         // originalLocalPointerPosition:获取当前鼠标起点  
    34.         RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition);  
    35.     }  
    36.     // 拖动  
    37.     public void OnDrag (PointerEventData data) {  
    38.         if (panelRectTransform == null || parentRectTransform == null)  
    39.             return;  
    40.         Vector2 localPointerPosition;  
    41.         // 获取本地鼠标位置  
    42.         if (RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out localPointerPosition)) {  
    43.             // 移动位置 = 本地鼠标当前位置 - 本地鼠标起点位置  
    44.             Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;  
    45.             // 当前面板位置 = 面板起点 + 移动位置  
    46.             panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal;  
    47.         }  
    48.         ClampToWindow ();  
    49.     }  
    50.       
    51.     // 限制当前面板在父节点中的区域位置  
    52.     void ClampToWindow () {  
    53.         // 面板位置  
    54.         Vector3 pos = panelRectTransform.localPosition;  
    55.   
    56.         // 如果是UI父节点,设置面板大小为0,那么最大最小位置为正负屏幕的一半  
    57.         Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min;  
    58.         Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max;  
    59.   
    60.         pos.x = Mathf.Clamp (panelRectTransform.localPosition.x, minPosition.x, maxPosition.x);  
    61.         pos.y = Mathf.Clamp (panelRectTransform.localPosition.y, minPosition.y, maxPosition.y);  
    62.           
    63.         panelRectTransform.localPosition = pos;  
    64.     }  
    65. }  



     

  • 相关阅读:
    阿里高级技术专家谈开源DDD框架:COLA4.0,分离架构和组件
    react的setState到底是同步还是异步?
    JMeter入门教程
    手把手教你接口自动化测试 – SoapUI & Groovy
    解读Web应用程序安全性问题的本质
    python实现的json数据以HTTP GET,POST,PUT,DELETE方式页面请求
    Linux常用命令
    PV原语操作详解
    软考计算机网络原理之IP计算问题汇总
    化繁为简了解进程与线程
  • 原文地址:https://www.cnblogs.com/nafio/p/9137124.html
Copyright © 2020-2023  润新知