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

本文介绍如何在Unity使用UGUI时,利用DragPanel脚本实现界面元素的拖动及排序功能。通过调整Transform的SetSiblingIndex属性,使被点击的界面显示在最前面,并详细展示了具体的代码实现。

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

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. }  



 

转载于:https://www.cnblogs.com/nafio/p/9137124.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值