UnityUI在屏幕范围内拖拽

一、单个Image拖拽

using UnityEngine;

using UnityEngine.EventSystems;

public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler

{

    private RectTransform rectTransform;

    private RectTransform canvasRectTransform;

    private Vector2 canvasSize;

    void Start()

    {

        rectTransform = GetComponent<RectTransform>();

        canvasRectTransform = rectTransform.parent.GetComponent<RectTransform>();

        canvasSize = canvasRectTransform.rect.size;

    }

    public void OnBeginDrag(PointerEventData eventData)

    {

        // 可以记录开始拖拽时的位置,如果需要的话

    }

    public void OnDrag(PointerEventData eventData)

    {

        // 计算新的位置

        Vector2 newPosition = rectTransform.anchoredPosition + eventData.delta;

        // 获取Image的尺寸

        Vector2 imageSize = rectTransform.rect.size;

        // 限制拖拽在Canvas范围内

        // 限制x轴

        newPosition.x = Mathf.Clamp(newPosition.x, -canvasSize.x / 2 + imageSize.x / 2, canvasSize.x / 2 - imageSize.x / 2);

        // 限制y轴

        newPosition.y = Mathf.Clamp(newPosition.y, -canvasSize.y / 2 + imageSize.y / 2, canvasSize.y / 2 - imageSize.y / 2);

        // 设置新的位置

        rectTransform.anchoredPosition = newPosition;

    }

    public void OnEndDrag(PointerEventData eventData)

    {

        // 可以在这里处理拖拽结束的逻辑

    }

}

单个Image拖拽

二、拖拽子Image

using UnityEngine;

using UnityEngine.EventSystems;

public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler

{

    public RectTransform smallImageRect; // 小Image的RectTransform

    private RectTransform largeImageRect; // 大Image的RectTransform,即脚本所在的RectTransform

    private RectTransform canvasRect; // Canvas的RectTransform

    void Start()

    {

        largeImageRect = GetComponent<RectTransform>();

        canvasRect = largeImageRect.parent as RectTransform; // 假设大Image直接在Canvas下

    }

    public void OnBeginDrag(PointerEventData eventData)

    {

        // 可以在这里添加开始拖拽的逻辑

    }

    public void OnDrag(PointerEventData eventData)

    {

        // 计算小Image相对于大Image的拖拽增量

        Vector2 delta = eventData.delta / canvasRect.localScale.x; // 考虑Canvas的缩放

        // 更新大Image的位置,使得小Image跟随拖拽

        Vector2 newPosition = largeImageRect.anchoredPosition + delta;

        largeImageRect.anchoredPosition = ClampPositionToBounds(newPosition);

    }

    public void OnEndDrag(PointerEventData eventData)

    {

        // 可以在这里添加结束拖拽的逻辑

    }

    private Vector2 ClampPositionToBounds(Vector2 newPosition)

    {

        // 计算大Image的边界

        Vector2 minPosition = new Vector2(

            -canvasRect.rect.width / 2 + largeImageRect.rect.width / 2,

            -canvasRect.rect.height / 2 + largeImageRect.rect.height / 2

        );

        Vector2 maxPosition = new Vector2(

            canvasRect.rect.width / 2 - largeImageRect.rect.width / 2,

            canvasRect.rect.height / 2 - largeImageRect.rect.height / 2

        );

        // 限制大Image的位置,确保它不会超出Canvas的范围

        newPosition.x = Mathf.Clamp(newPosition.x, minPosition.x, maxPosition.x);

        newPosition.y = Mathf.Clamp(newPosition.y, minPosition.y, maxPosition.y);

        return newPosition;

    }

}

拖拽子Image

三、拖拽吸附边缘

using UnityEngine;

using UnityEngine.EventSystems;

public class Draggable : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler

{

    public RectTransform smallImageRect; // 小Image的RectTransform

    private RectTransform largeImageRect; // 大Image的RectTransform,即脚本所在的RectTransform

    private RectTransform canvasRect; // Canvas的RectTransform

    void Start()

    {

        largeImageRect = GetComponent<RectTransform>();

        canvasRect = largeImageRect.parent as RectTransform; // 假设大Image直接在Canvas下

    }

    public void OnBeginDrag(PointerEventData eventData)

    {

        // 可以在这里添加开始拖拽的逻辑

    }

    public void OnDrag(PointerEventData eventData)

    {

        // 计算小Image相对于大Image的拖拽增量

        Vector2 delta = eventData.delta / canvasRect.localScale.x; // 考虑Canvas的缩放

        // 更新大Image的位置,使得小Image跟随拖拽

        Vector2 newPosition = largeImageRect.anchoredPosition + delta;

        largeImageRect.anchoredPosition = ClampPositionToBounds(newPosition);

    }

    public void OnEndDrag(PointerEventData eventData)

    {

        // 可以在这里添加结束拖拽的逻辑

        if (largeImageRect.anchoredPosition.x < 0)

        {

            // 吸附到左侧边缘

            largeImageRect.anchoredPosition = new Vector2(-canvasRect.rect.width / 2 + largeImageRect.rect.width / 2, largeImageRect.anchoredPosition.y);

        }

        else

        {

            // 吸附到右侧边缘

            largeImageRect.anchoredPosition = new Vector2(canvasRect.rect.width / 2 - largeImageRect.rect.width / 2, largeImageRect.anchoredPosition.y);

        }

}

    private Vector2 ClampPositionToBounds(Vector2 newPosition)

    {

        // 计算大Image的边界

        Vector2 minPosition = new Vector2(

            -canvasRect.rect.width / 2 + largeImageRect.rect.width / 2,

            -canvasRect.rect.height / 2 + largeImageRect.rect.height / 2

        );

        Vector2 maxPosition = new Vector2(

            canvasRect.rect.width / 2 - largeImageRect.rect.width / 2,

            canvasRect.rect.height / 2 - largeImageRect.rect.height / 2

        );

        // 限制大Image的位置,确保它不会超出Canvas的范围

        newPosition.x = Mathf.Clamp(newPosition.x, minPosition.x, maxPosition.x);

        newPosition.y = Mathf.Clamp(newPosition.y, minPosition.y, maxPosition.y);

        return newPosition;

    }

}

拖拽吸附边缘
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、Unity简介 1. Unity界面 Shift + Space : 放大界面 Scene界面按钮渲染模式2D...
    MYves阅读 12,689评论 0 22
  • UGUI做一个类似Windows的框选功能: 效果: 主要用到的知识点,就是2D世界的碰撞检测(BoxCollid...
    runinnn阅读 3,818评论 2 3
  • 使用ugui做一个可以吸取屏幕上图片的颜色的功能。 然后主要用到的知识点就是 这个方法了:Texture2D.Ge...
    runinnn阅读 6,323评论 0 3
  • 在Unity中,UI系统是通过UGUI实现的。UGUI是一种基于Unity的用户界面系统,它可以用来创建和管理UI...
    游戏程序猿阅读 3,408评论 0 1
  • RectTransformUtility 是关于RectTransform的工具类,有几个静态方法,这里记录一下每...
    迷途小路阅读 8,478评论 0 0

友情链接更多精彩内容