Unity UGUI 效果 之 鼠标拖拽UI实现放大缩小实时调整UI大小 Resize 的功能

 

 

Unity UGUI 效果 之 鼠标拖拽UI实现放大缩小实时调整UI大小 Resize 的功能

 

目录

Unity UGUI 效果 之 鼠标拖拽UI实现放大缩小实时调整UI大小 Resize 的功能

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码


 

一、简单介绍

UGUI,是Unity自带的 GUI 系统,有别于 NGUI;使用 UGUI 也能制作出比较酷炫的效果 。

本节介绍,使用 UGUI 通过代码实现鼠标点击拖拽UI实现动态调整图片大小的功能,方法不唯一,欢迎指正。

 

二、实现原理

1、OnPointerDown 鼠标在UI 上点击,记录变化前的大小和鼠标位置

2、OnDrag 获得鼠标拖拽的位置与之前点击鼠标位置的差值,实现大小的变化

 

三、注意事项

1、鼠标的点击位置区分左上和右下,实现,鼠标向内缩小,向外放大的效果,不然变化会很怪异

2、注意 UI 锚点都在中心位置

 

四、效果预览

 

五、实现步骤

1、打开Unity,新建一个工程

 

2、添加一个 Image,最为调整大小的 UI

 

3、这里UI 的锚点都在中心位置

 

4、在工程中新建脚本,实现点击UI,拖拽实现调整UI大小的功能

 

5、脚本挂载到 UI 上,可以根据使用情况调整限定最大最小值

 

6、运行场景,效果如上

 

六、关键代码

1、PointerDragDragUIToResize

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

namespace XANTools
{
    /// <summary>
    /// 拖拽移动UI的大小
    /// 是哟ing说明
    /// 1、点击 UI
    /// 2、拖拽UI,UI的大小就会更改变化
    /// 3、变化会在限定大小内变化
    /// </summary>
    public class PointerDragDragUIToResize : MonoBehaviour, IPointerDownHandler, IDragHandler
    {
        [Header("调整的最小值")]
        public Vector2 minSize = new Vector2(50, 50);
        [Header("调整的最大值")]
        public Vector2 maxSize = new Vector2(500, 500);

        // UI 的 RectTransform
        private RectTransform panelRectTransform;

        // 鼠标按下的时候鼠标位置转到UI的位置的大小
        private Vector2 originalLocalPointerPosition;

        // 鼠标按下的时候UI原来的大小
        private Vector2 originalSizeDelta;

        // 判断鼠标的点击位置,是左上还是右上(让变化合理(鼠标向内drag是变小,向外drag是变大))
        private bool isUpLeft = false;

        void Awake()
        {
            panelRectTransform = transform.GetComponent<RectTransform>();

        }

        /// <summary>
        /// 鼠标按下事件
        /// </summary>
        /// <param name="data"></param>
        public void OnPointerDown(PointerEventData data)
        {
            // 记录按下鼠标变化前的大小
            originalSizeDelta = panelRectTransform.sizeDelta;

            // 记录按下鼠标的位置
            RectTransformUtility.ScreenPointToLocalPointInRectangle(panelRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition);

            // 判断鼠标的点击位置(对角线法)
            if ((originalLocalPointerPosition.x - originalLocalPointerPosition.y) < 0)
            {
                isUpLeft = true;

            }
            else
            {
                isUpLeft = false;

            }
        }

        /// <summary>
        /// 拖拽事件
        /// </summary>
        /// <param name="data"></param>
        public void OnDrag(PointerEventData data)
        {
            // UI 的安全校验
            if (panelRectTransform == null)
                return;

            // Drag 变化的变量
            Vector2 localPointerPosition;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(panelRectTransform, data.position, data.pressEventCamera, out localPointerPosition);

            // Drag 变化值于鼠标按下拖拽前的值之间的差值
            Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;

            // UI RectTransform 差值变化 (注意左上和右下的区别对待)
            Vector2 sizeDelta = originalSizeDelta + new Vector2(offsetToOriginal.x, -offsetToOriginal.y) * (isUpLeft == true ? -1 : 1);
            sizeDelta = new Vector2(
                    Mathf.Clamp(sizeDelta.x, minSize.x, maxSize.x),
                    Mathf.Clamp(sizeDelta.y, minSize.y, maxSize.y)
            );

            // 赋值,实现大小调整
            panelRectTransform.sizeDelta = sizeDelta;
        }


    }
}

 

 

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Unity中,UGUI的EventTrigger是一个非常有用的组件,它可以用于实现UI拖拽和位置交换的功能。 首先,需要在要实现拖拽和位置交换的UI元素上添加EventTrigger组件。可以通过代码或者在Inspector面板中进行操作。然后,需要添加相应的事件触发器,例如拖拽开始、拖拽移动、拖拽结束等事件。 接下来,需要编写拖拽的逻辑代码。可以使用Unity提供的接口来处理拖拽事件,例如OnBeginDrag、OnDrag和OnEndDrag。在OnBeginDrag事件中,可以获取到拖拽起始位置,并将拖拽中的UI元素设置为可拖拽状态。在OnDrag事件中,可以实时获取到拖拽的位置,并将UI元素跟随鼠标或手指移动。在OnEndDrag事件中,可以获取到拖拽结束位置,并将UI元素设置回初始位置。 要实现位置交换功能,可以在UI元素上添加Collider组件,并根据拖拽的起始和结束位置来计算是否需要进行位置交换。可以使用RaycastHit来判断拖拽位置是否与其他UI元素重合,并记录下交换元素的信息。然后,根据交换元素的信息,可以将两个UI元素的位置进行互换。 最后,为了保证拖拽和位置交换功能的流畅性和用户体验,还可以添加一些动画效果和交互反馈。例如,在拖拽开始时可以添加一些拖拽阴影效果,使拖拽UI元素看起来更加立体和真实。在位置交换时,可以添加一些过渡动画,使UI元素的位置变换更加平滑和自然。 总之,利用Unity中UGUI的EventTrigger组件,结合适当的逻辑代码和交互反馈,可以很方便地实现UI拖拽和位置交换功能。这种功能可以在游戏开发中广泛应用,例如拼图游戏、物品交换系统等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙魁XAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值