unity 实现拖动ui填空,并判断对错

news2024/10/5 15:31:18

参考:https://ask.csdn.net/questions/7971448

根据自己的需求修改为如下代码

使用过程中,出现拖动ui位置错误的情况,修改为使用 localPosition
但是吸附到指定位置却需要用的position

    public class DragAndDrop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
    {
        private RectTransform dragTransform;
        private Vector2 initPosition;
        private Vector2 startPosition;

        [Header("正确区域")]
        public RectTransform targetArea;

        [Header("初始区域")]
        public RectTransform originalArea;
        [Header("错误区域")]
        public RectTransform[] targetOtherArea;

        private bool result;    //拖动结果
        private bool valid;     //拖动有效

        public bool Result { get => result; private set => result = value; }
        public bool Valid { get => valid; private set => valid = value; }

        public void Awake()
        {
            dragTransform = GetComponent<RectTransform>();

            //初始位置
            initPosition = dragTransform.localPosition;
        }

        /// <summary>
        /// 重置位置
        /// </summary>
        public void ResetPos()
        {
            dragTransform.localPosition = initPosition;
            result = false;
            valid = false;
        }

        public void OnBeginDrag(PointerEventData eventData)
        {
            //开始拖动的位置
            startPosition = dragTransform.localPosition;

            //设置UI最后渲染
            dragTransform.SetAsLastSibling();
        }

        public void OnDrag(PointerEventData eventData)
        {
            dragTransform.localPosition = GetLocalPosition(eventData.position);
        }

        public void OnEndDrag(PointerEventData eventData)
        {
            result = RectTransformUtility.RectangleContainsScreenPoint(targetArea, eventData.position);
#if UNITY_EDITOR
            Debug.Log($"拖动结果: {result}");
#endif
            if (result)
            {
                //吸附到目标位置
                dragTransform.position = targetArea.position;
                valid = true;
                return;
            }
            else
            {
                foreach (var item in targetOtherArea)
                {
                    if (RectTransformUtility.RectangleContainsScreenPoint(item, eventData.position))
                    {
                        //吸附到目标位置
                        dragTransform.position = item.position;
                        valid = true;
                        return;
                    }
                }
                //原始位置,拖动无效
                if (RectTransformUtility.RectangleContainsScreenPoint(originalArea, eventData.position))
                {
                    //吸附到目标位置
                    dragTransform.position = originalArea.position;
                    valid = false;
                    return;
                }
            }

            //其它情况还原为开始拖动的位置
            valid = false;
            dragTransform.localPosition = startPosition;
        }

        private Vector2 GetLocalPosition(Vector2 screenPosition)
        {
            Vector2 localPosition = Vector2.zero;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(dragTransform.parent as RectTransform, screenPosition, null, out localPosition);
            return localPosition;
        }
    }

Demo

using MyTool.Tools;
using UnityEngine;
using UnityEngine.UI;

public class Demo : MonoBehaviour
{
    public DragAndDrop dragAndDrop;
    public Button okBtn;

    // Start is called before the first frame update
    void Start()
    {
        okBtn.onClick.AddListener(OnClickOkBtn);
    }

    private void Update()
    {
        okBtn.interactable = dragAndDrop.Valid;
    }

    void OnClickOkBtn()
    {
        if (dragAndDrop.Result)
        {
            Debug.Log("恭喜你答对了!");
        }
        else
        {
            Debug.Log("很遗憾,没有答对!");
        }
    }
}

ui搭建
在这里插入图片描述
效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1091466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OJ第三篇

文章目录 随机链表的复制 随机链表的复制 链接:随机链表的复制 这个题简单而言就是它给一个链表&#xff0c;每个结点包含两个指针&#xff0c;分别指向下一个和一个随机的结点&#xff08;也有可能指向空&#xff09;&#xff0c;你要做的就是复制这个链表&#xff0c;使你创…

Leetcode算法解析——快乐数

1.题目链接&#xff1a;快乐数 2.题目描述&#xff1a; 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循…

死锁原因及死锁检测组件的实现

1 死锁形成的条件 死锁&#xff0c;是指多个线程或者进程在运行过程中因争夺有限的系统资源而造成的一种僵局&#xff0c;当进程或者线程处于这种僵持状态&#xff0c;若无外力作用&#xff0c;它们将无法再向前推进。如下图所示&#xff0c;线程 A 想获取线 程 B 的锁&#x…

当你在 Tubi 是一位 Tech Lead

在过去&#xff0c;我们邀请了 Tubi 技术团队的许多资深工程师&#xff0c;听他们分享了作为资深工程师的一些故事。今天&#xff0c;我们将镜头转向那些在 Tubi 担任 Tech Lead 的工程师&#xff0c;他们选择了在独立开发之外&#xff0c;承担一定的技术管理工作&#xff1a; …

计算机网络——计算机网络体系结构(1/4)-常见的计算机网络体系结构(OSI体系、TCP/IP体系、原理体系五层协议)

目录 OSI体系结构 OSI体系介绍 OSI失败的原因 TCP/IP体系结构 TCP/IP概述 网络接口层 网际层 运输层 应用层 TCP/IP命名的由来 原理体系结构&#xff08;五层协议&#xff09; OSI体系结构 OSI体系介绍 著名的“开放系统互连参考模型”&#xff0c;简称为OSI。该模…

Windows下Qt读取系统的内存、CPU、GPU等使用信息

一、前言 在当今计算机应用广泛的领域中&#xff0c;了解系统的内存、CPU和GPU使用情况是非常重要的。对于开发人员和系统管理员来说&#xff0c;准确获取这些信息可以帮助他们优化软件性能、诊断问题并做出相应的调整。在Windows平台上实现这一目标会涉及到调用Windows系统AP…

Apifox 学习笔记 - 前置操作之:动态更新请求体中的时间戳

Apifox 学习笔记 - 前置操作之&#xff1a;动态更新请求体中的时间戳 1. 在前置操作中添加一个&#xff1a;自定义脚本或公共脚本2. 定义我们所需的环境变量。3. 在请求参数中使用【时间戳】4. 检验参考资料 1. 在前置操作中添加一个&#xff1a;自定义脚本或公共脚本 2. 定义我…

WPF DataGrid详细列表手动显示与隐藏

设置显示序号与折叠显示样式 <DataTemplate x:Key"dtNum"><Button BorderBrush"Transparent" Style"{x:Null}" Click"BtnRowDetail_ShowHideClick" FontSize"16" Background"Transparent"><Stack…

Dubbo从0到1——万字完整学习笔记

目录 RPC理论概述 RPC的基本思想 RPC的实现组成部分 RPC的实现流程 RPC的核心思想 RPC调用分类 初识Dubbo Dubbo特性 Dubbo设计架构 zookeeper环境搭建 搭建注册中心环境 搭建监控中心环境 Dubbo入门案例(Dubbo Spring) 实现步骤 搭建中介者组件共享资源 打包为jar&#xf…

京东数据接口:京东数据分析怎么做?

电商运营中数据分析的重要性不言而喻&#xff0c;而想要做数据分析&#xff0c;就要先找到数据&#xff0c;利用数据接口我们能够更轻松的获得比较全面的数据。因此&#xff0c;目前不少品牌商家都选择使用一些数据接口来获取相关电商数据、以更好地做好数据分析。 鲸参谋电商…

[0xGameCTF 2023] web题解

文章目录 [Week 1]signinbaby_phphello_httprepo_leakping [Week 2]ez_upload [Week 1] signin 打开题目&#xff0c;查看下js代码 在main.js里找到flag baby_php <?php // flag in flag.php highlight_file(__FILE__);if (isset($_GET[a]) && isset($_GET[b])…

2023年中国家纺行业研究报告

第一章 行业概况 1.1 定义 家纺行业&#xff0c;即家用纺织品行业&#xff0c;是纺织业中的一个重要分支&#xff0c;它与服装用纺织品和产业用纺织品共同构成了纺织业的三大支柱。家纺不仅仅是家庭生活中的必需品&#xff0c;更是居室装饰中不可或缺的元素&#xff0c;被誉为…

Java多线程篇(11)——BlockingQueue(优先级阻塞,延迟队列)

文章目录 1、PriorityBlockingQueue2、DelayQueue 1、PriorityBlockingQueue 优先级阻塞队列就是在优先级队列的基础上增加队列排序的功能&#xff0c;将高优先级排在前面&#xff0c;所以优先级队列的元素需要实现Comparator接口。 如果数据结构用数组去维护队列的话&#xf…

uniapp系列-图文并茂教你配置uniapp开发环境

环境安装 1. 安装 node.js (版本 18/16) 在搭建 Vue 开发环境之前&#xff0c;请先下载 node.js。 Node 可从官方网站下载&#xff0c;也可从中文网站下载。根据你的电脑选择 32 位 或 64 位。网站&#xff1a; Node 或者访问 历史版本 查看 node 版本 C:\Users> node -…

超级干货 | 数据平滑9大妙招(python版)

大家好&#xff0c;对数据进行平滑处理的方法有很多种&#xff0c;具体的选择取决于数据的性质和处理的目的。今天给大家分享9大常见数据平滑方法&#xff1a; 移动平均Moving Average 指数平滑Exponential Smoothing 低通滤波器 多项式拟合 贝塞尔曲线拟合 局部加权散点平…

【python海洋专题二十一】subplots共用一个colorbar

上期读取subplot&#xff0c;并出图 但是存在一些不完美&#xff0c;本期修饰 本期内容 共用colorbar 1&#xff1a;未共用colorbar 共用colorbar 1&#xff1a;横 2&#xff1a;纵 关键语句 图片 cb_ax fig.add_axes([0.15, 0.02, 0.6, 0.03]) #设置colarbar位置 cbar …

切换npm的版本

1、在配置环境变量的地址中&#xff0c;多准备几个已解压版本的node 2、要想升降版本直接更改该文件中的文件夹名称就行 环境变量中的path的值是不用变的C:\Program Files\nodejs

Leetcode 剑指 Offer II 048. 二叉树的序列化与反序列化

题目难度: 困难 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#…

商品分类代码

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>商品分类代码</title> <script type"text/javascript"> function MM_preloadImages() { //v3.0var ddocument; if(d.images){ if(!d.MM_p) d.MM_p…

5+甲基化+预后模型搭配实验

今天给同学们分享一篇甲基化预后模型实验的生信文章“Six immune-related promising biomarkers may promote hepatocellular carcinoma prognosis: a bioinformatics analysis and experimental validation”&#xff0c;这篇文章于2023年3月23日发表在Cancer Cell Int期刊上&…