ugui 拖拽组件 scrollrect 怎么实现自动停在子对象中心

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ugui 拖拽组件 scrollrect 怎么实现自动停在子对象中心相关的知识,希望对你有一定的参考价值。

参考技术A 1. 判定cell大小 LoopScrollRect要解决的核心问题是:如何计算每个元素的大校这里我使用了Content Size Fitter配合Layout Element来控制每个cell的长宽,因此对于GridLayout直接取高度,否则取Preferred Height。需要注意的是,除了元素本身的大...

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身上:

运行程序即可。

以上是关于ugui 拖拽组件 scrollrect 怎么实现自动停在子对象中心的主要内容,如果未能解决你的问题,请参考以下文章

unity UGUI动态滑动列表

Unity实现滑动列表(ScrollView)-UGUI

如何优化UGUI的ScrollRect

unity UGUI怎么让 被拖拽的UI最后渲染

UGUI ScrollRect 代码定位

如何优化UGUI的ScrollRect-Unity-VR开发网