Unity3D-UGUI应用篇UGUI实现窗口的自由拖拽
Posted 恬静的小魔龙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D-UGUI应用篇UGUI实现窗口的自由拖拽相关的知识,希望对你有一定的参考价值。
推荐阅读
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
一、前言
前段时间分享了UGUI的每个组件的属性和使用方法,比如Text、Button、Image、Toggle、InputField、ScrollView等等。
接着分享了UGUI的一些原理,比如说UGUI的渲染模式、UGUI的缩放计算、UGUI的描点定位、UGUI的自动布局等等。
相信大家看完后会对UGUI有一个比较全面的认识了。
下面,就继续分享UGUI的UI组件进行应用的实例。
这是本系列文章的第七篇:
【Unity3D-UGUI应用篇】(一)使用Text实现进度等待动画
【Unity3D-UGUI应用篇】(二)使用Image实现进度条动画
【Unity3D-UGUI应用篇】(三)使用UGUI实现层级菜单
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
【Unity3D-UGUI应用篇】(五)使用Button完成鼠标移动到UI上面显示文字功能
【Unity3D-UGUI应用篇】(六)屏幕自适应(多分配率适配)
【Unity3D-UGUI应用篇】(七)UGUI实现窗口的自由拖拽
【Unity3D-UGUI应用篇】(八)Image实现画线、画三角形、画正方形、画圆
二、介绍及效果图
在使用UGUI开发项目的时候,常常会遇到需要做一个窗口拖拽的功能。
窗口拖拽的功能可以使用UGUI内置的事件接口IPointerDownHandler和IDragHandler,并在接口方法OnPointerDown和OnDrag实现了相应的拖拽逻辑即可实现。
下面,来看一下效果:
实现比较简单,就不放源代码了。
下面就跟着博主来看一下如何实现吧。
三、实现
首先,我们搭建一个UI窗口:
UI结构:
一个Panel作为背景,然后父Image作为整个UI窗口的背景,子Image作为标题的背景,标题为窗口A。
再复制一个放到一边,修改标题窗口B。
代码实现:
using UnityEngine;
using UnityEngine.EventSystems;
public class DragWindow : MonoBehaviour, IPointerDownHandler, IDragHandler
{
private Vector2 localMousePos;
private Vector3 planeLocalPos;
private RectTransform targetObject;
private RectTransform parentRectTransform;
private RectTransform targetRectTransform;
void Awake()
{
targetObject = this.transform.GetComponent<RectTransform>();
targetRectTransform = targetObject;
parentRectTransform = targetObject.parent as RectTransform;
}
public void OnPointerDown(PointerEventData eventData)
{
planeLocalPos = targetRectTransform.localPosition;
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, eventData.position, eventData.pressEventCamera, out localMousePos);
targetObject.gameObject.transform.SetAsLastSibling();
}
public void OnDrag(PointerEventData eventData)
{
Vector2 localPointerPosition;
//屏幕点到矩形中的局部点
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, eventData.position, eventData.pressEventCamera, out localPointerPosition))
{
Vector3 offsetToOriginal = localPointerPosition - localMousePos;
targetObject.localPosition = planeLocalPos + offsetToOriginal;
}
}
}
将代码拖到父Image身上:
运行程序即可。
以上是关于Unity3D-UGUI应用篇UGUI实现窗口的自由拖拽的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D-UGUI应用篇Image实现画线画三角形画正方形画圆