当前位置: 首页 > news >正文

Unity背包道具拖拽(极简版实现)

(感觉Csdn代码页面可以再大一点或者加个放大功能 不然得划着看不太舒服)

1.关键接口,三个拖拽相关的

2.关键参数,PointerEventData

一直没仔细看过,其实有包含鼠标相关的很多参数,鼠标点击次数,判断是否拖动等等。这里是使用了pointerCurrentRaycast,也就是当前触碰到的物体的信息,注意是当前,也就是只有一个,所以当我们想要拖动一个道具放到格子中的时候,一定会先触碰到当前道具,所以还需要CanvasGroup组件,当道具开始挪动的时候,将blocksRaycasts设为false,也就是当前道具不能被射线检测,这样就可以检测到道具后面的槽位了

3.关于道具拖动,有两种实现方式

第一种 transform.postion = event.position

第二种 rectTransform.anchoredPosition += eventData.delta;

eventData.delta:鼠标在一帧内的移动距离

这样做会使UI元素在每一帧都根据鼠标的移动更新自己的位置,从而实现了拖拽的效果。

4.基本概念要搞清楚

rectTransform.anchoredPosition:表示Rect Transform的中心点相对于锚点的位置。

event.position:是基于屏幕坐标的,代表了当前鼠标在屏幕上的位置

transform.position它是世界坐标嘛对吧,为什么可以直接使用呢?

其实最稳妥的做法是将event.position通过Camera.ScreenToWorldPoint转换为世界坐标,再给transform.position赋值,在这里没有出错是因为,Canvas 设置为 Screen Space - Overlay 模式时,Canvas的内容会像UI元素一样,直接显示在屏幕的最上层,不受场景中摄像机视角的影响,也就是所有的子元素都是相对于屏幕坐标系的,而不是相对于世界坐标系的。因此,在这种情况下,eventData.position 提供的屏幕坐标可以直接应用于这些 UI 元素的 Transform 组件。

public class UIBagItem : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{private Vector3 startVec;public Image img;public Text level;private ItemInfo info;public Transform itemTrans;public Transform pastParent;private RectTransform rectTransform;void Awake(){rectTransform = GetComponent<RectTransform>();}public void Init(int id, int level, Transform parent){this.info = DataManager.Instance.itemInfo[id - 1];this.img.sprite = Resources.Load<Sprite>(Config.bagPath + info.name);this.level.text = level.ToString();this.transform.parent = pastParent = parent;this.rectTransform.anchoredPosition = Vector2.zero;this.itemTrans = GameObject.Find("ItemTransform").transform;}public void OnBeginDrag(PointerEventData eventData){//鼠标点击的点 pointerEventDatathis.transform.SetParent(itemTrans);this.transform.position = eventData.position;this.GetComponent<CanvasGroup>().blocksRaycasts = false;}public void OnDrag(PointerEventData eventData){//eventData.delta 鼠标拖拽的位移量rectTransform.anchoredPosition += eventData.delta;Debug.Log(eventData.pointerCurrentRaycast.gameObject.name);}public void OnEndDrag(PointerEventData eventData){this.GetComponent<CanvasGroup>().blocksRaycasts = true;GameObject target = eventData.pointerCurrentRaycast.gameObject;ItemInfo targetInfo;//判断是否是道具if (target.name == "UIBagItem(Clone)"){targetInfo = target.GetComponent<UIBagItem>().info;//再判断是否可以合成if(this.info.id == targetInfo.id){//可以合成就保存数据DataManager.Instance.UpdateBagInfo(targetInfo.consumeId, targetInfo.composeId);//更新UI 将目标位置的UI更新为合成后的UItarget.GetComponent<UIBagItem>().Init(targetInfo.composeId, DataManager.Instance.itemInfo[targetInfo.composeId - 1].level,target.transform.parent);Destroy(this.gameObject);}//不能合成就交换位置else{//本物体父节点this.transform.SetParent(target.transform.parent);//目标物体的父节点 = 本物体记录的父节点target.transform.SetParent(this.pastParent);//理解为A=B B=C C=A就好了 这里记录一下Transform tempParent = this.pastParent;//这里更新本物体记录的父节点this.pastParent = target.GetComponent<UIBagItem>().pastParent;//目标物体记录的父节点target.GetComponent<UIBagItem>().pastParent = tempParent;//相对于父物体的位置为0所以这样写this.rectTransform.anchoredPosition = Vector2.zero;//相对于父物体的位置为0所以这样写target.GetComponent<UIBagItem>().rectTransform.anchoredPosition = Vector2.zero;//不为0的话就把偏移值赋值上去}}//为什么这里判断标签 是因为格子都是复制出来的 名字后面会有个数else if (target.tag == "BagSlot"){this.transform.SetParent(target.gameObject.transform);this.rectTransform.anchoredPosition = Vector2.zero;}//其他区域 直接归原位else{this.transform.SetParent(this.pastParent);}}
}

相关文章:

Unity背包道具拖拽(极简版实现)

&#xff08;感觉Csdn代码页面可以再大一点或者加个放大功能 不然得划着看不太舒服&#xff09; 1.关键接口&#xff0c;三个拖拽相关的 2.关键参数&#xff0c;PointerEventData 一直没仔细看过&#xff0c;其实有包含鼠标相关的很多参数&#xff0c;鼠标点击次数&#xff…...

spark读取普通文件

spark读取普通文件 txt文件 """ 将一行数据当做一个字段&#xff0c;需要自己切割 字段名称为value 表结构 可以从sql中搞 """ df spark.read.text("../../data/wordcount/input/data.txt") df spark.read.format("text"…...

MySQL SQL语句性能优化

MySQL SQL语句性能优化指南 一、查询设计优化1. 避免 SELECT *2. 使用 WHERE 进行条件过滤3. 避免在索引列上使用函数和表达式4. 使用 LIMIT 限制返回行数5. 避免使用子查询6. 优化 JOIN 操作7. 避免全表扫描 二、索引优化1. 使用合适的索引2. 覆盖索引3. 索引选择性4. 多列索引…...

【蓝桥杯每日一题】技能升级

技能升级 2024-12-10 蓝桥杯每日一题 技能升级 二分 题目大意 一个角色有 N 种可以增加攻击力的技能&#xff0c;对于第 i 个技能首次升级可以提升 A i A_i Ai​ 点攻击力&#xff0c;随后的每次升级增加的攻击力都会减少 B i B_i Bi​ 。升级 ⌈ A i B i ⌉ \lceil \frac{A…...

css 实现在一条线上流动小物体(offset-path)

直接贴代码,留几个参考网址给大家 【SVG】路径<Path>标签详解,一次搞懂所有命令参数 探秘神奇的运动路径动画 Motion Path <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport&quo…...

探索 Robyn 框架 —— 下一代高性能 Web 框架

技术博客&#xff1a;探索 Robyn 框架 —— 下一代高性能 Web 框架 什么是 Robyn&#xff1f; Robyn 是一个用 Rust 编写的高性能 Web 框架&#xff0c;旨在通过极简设计和高效并发处理&#xff0c;帮助开发者快速构建可扩展的现代 Web 应用。得益于 Rust 的内存安全性和性能…...

STL容器-map P3613【深基15.例2】寄包柜 普及-

题目来源&#xff1a;洛谷题库 文章目录 map例题map知识点map使用注意&#xff1a;map的常用用法 map例题 P3613【深基15.例2】寄包柜 普及- 题意 根据数据插入/查询 思路 map键值对可以根据柜子编号查找物品&#xff0c;但是柜子又有很多个&#xff0c;考虑数组或者map数组…...

【MySQL 进阶之路】了解 性能优化 与 设计原则

1.B树的优势 “矮胖”结构&#xff1a; 矮&#xff1a;B树的每个节点存储更多的关键字&#xff0c;从而减少了树的层级&#xff08;最多三层&#xff09;&#xff0c;减少了磁盘I/O操作&#xff0c;提高了查询效率。胖&#xff1a;叶子节点存储实际的数据&#xff0c;并使用双…...

MySQL之数据库三大范式

一、什么是范式&#xff1f; 范式是数据库遵循设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 &#xff08;范式是具有最小冗余的表结构&#xff09; 范式可以 提高数据的一致性和 减少数据冗余和 更新异常的问题 数据库有六种范式&#xff08;1NF/2NF/3NF…...

[大数据]Hudi

G:\Bigdata\17.hudi\大数据技术之数据湖Hudi 第1章 Hudi概述 1.1 Hudi简介 Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服…...

jenkins harbor安装

Harbor是一个企业级Docker镜像仓库‌。 文章目录 1. 什么是Docker私有仓库2. Docker有哪些私有仓库3. Harbor简介4. Harbor安装 1. 什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub&#xff0c;而与Dock…...

JavaScript 高级特性与 ES6 新特性:正则表达式的深度探索

在现代 JavaScript 开发中&#xff0c;正则表达式&#xff08;Regular Expressions&#xff09;和高级特性、ES6 新特性的结合使用&#xff0c;能够极大地提升代码的简洁性、可读性和功能性。本文将深入探讨 JavaScript 中的正则表达式及其在高级特性和 ES6 新特性中的应用&…...

正则表达式——参考视频B站《奇乐编程学院》

智能指针 一、背景&#x1f388;1.1. 模式匹配&#x1f388;1.2. 文本替换&#x1f388;1.3. 数据验证&#x1f388;1.4. 信息提取&#x1f388;1.5. 拆分字符串&#x1f388;1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…...

【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )

文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数…...

【多模态文档智能】OCR-free感知多模态大模型技术链路及训练数据细节

目前的一些多模态大模型的工作倾向于使用MLLM进行推理任务&#xff0c;然而&#xff0c;纯OCR任务偏向于模型的感知能力&#xff0c;对于文档场景&#xff0c;由于文字密度较高&#xff0c;现有方法往往通过增加图像token的数量来提升性能。这种策略在增加新的语言时&#xff0…...

Mybatis动态sql执行过程

动态SQL的执行原理主要涉及到在运行时根据条件动态地生成SQL语句&#xff0c;然后将其发送给数据库执行。以下是动态SQL执行原理的详细解释&#xff1a; 一、接收参数 动态SQL首先会根据用户的输入或系统的条件接收参数。这些参数可以是查询条件、更新数据等&#xff0c;它们…...

leetcode 31 Next Permutation

题意 找到下一个permutation是什么&#xff0c;对于一个数组[1&#xff0c;2&#xff0c;3]&#xff0c;下一个排列就是[1, 3, 2] 链接 https://leetcode.com/problems/next-permutation/ 思考 首先任何一个permutation满足一个性质&#xff0c;从某个位置往后一定是降序。…...

每日一练 | 华为 eSight 创建的缺省角色

01 真题题目 下列选项中&#xff0c;不属于华为 eSight 创建的缺省角色的是&#xff1a; A. Administrator B. Monitor C. Operator D. End-User 02 真题答案 D 03 答案解析 华为 eSight 是一款综合性的网络管理平台&#xff0c;提供了多种管理和监控功能。 为了确保不同用…...

PyTorch基本使用-自动微分模块

学习目的&#xff1a;掌握自动微分模块的使用 训练神经网络时&#xff0c;最常用的算法就是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;会根据损失函数关于对应参数的梯度进行调整。为了计算这些梯度&#xff0c;PyTorch 内置了名为 torch.autogra…...

libevent-Reactor设计模式【1】

一、Libevent概述 1、简介 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff0c;不如 ACE 那么臃肿庞大&#…...

【Anaconda】使用指南及问题汇总(自用)

安装 1. Anaconda的下载与安装 除了安装路径修改&#xff0c;其他的一路默认就好 2. Anaconda修改环境变量 因为我们这一步才手动添加环境变量&#xff0c;所以第一步安装的时候不要让它自动配置环境变量了。 用户变量或者系统变量都可以。建议系统变量&#xff0c;方便后…...

Postman登录接口响应为空?HTTP响应体未刷出的三层根因分析

1. 这不是Postman的问题&#xff0c;是接口通信链路上某个环节“失语”了你用Postman调后端登录接口&#xff0c;请求发出去了&#xff0c;状态码也回来了&#xff08;比如200&#xff09;&#xff0c;但响应体里空空如也——没有JSON数据、没有token字段、甚至Response标签页里…...

告别手动计算!用Biopython+DSSP批量分析蛋白质溶剂可及性(附完整脚本)

告别手动计算&#xff01;用BiopythonDSSP批量分析蛋白质溶剂可及性&#xff08;附完整脚本&#xff09; 蛋白质溶剂可及性&#xff08;RSA&#xff09;是结构生物学中的关键参数&#xff0c;它量化了氨基酸残基在蛋白质表面暴露于溶剂的程度。传统手动计算方式在面对大规模PD…...

hccl 集合通信架构剖析:Ring-AllReduce 与通信-计算重叠设计

前言 分布式训练做多了会发现&#xff0c;多卡之间的通信往往比计算更吃时间。八张昇腾NPU跑一个LLaMA-70B&#xff0c;AllReduce在总耗时里能占30-40%&#xff0c;这个比例在卡数更多的时候还会继续涨。昇腾CANN的hccl&#xff08;Huawei Collective Communication Library&am…...

2025年终极指南:PlayIntegrityFix让你的Root设备完美通过Google认证

2025年终极指南&#xff1a;PlayIntegrityFix让你的Root设备完美通过Google认证 【免费下载链接】PlayIntegrityFix Fix Play Integrity (and SafetyNet) verdicts. 项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix 还在为Root后的Android设备无法正…...

2026学生背单词软件实测,这5款真心好用不踩坑

过去几年我们团队在帮助不同学段学生提升词汇量时&#xff0c;踩过不少坑&#xff1a;有的工具背词效率还行&#xff0c;但同步一塌糊涂&#xff1b;有的界面酷炫&#xff0c;算法推荐却毫无个性&#xff0c;仿佛在用十年前的技术。市面上背单词软件看似饱和&#xff0c;真正能…...

装配骨架:每一帧重新构建简笔人物,文本围绕当前姿势环绕显示

【导语&#xff1a;资讯介绍了装配骨架的相关情况&#xff0c;包括每一帧重新构建简笔人物&#xff0c;文本围绕当前姿势环绕显示&#xff0c;还有波浪动画等视觉效果及闲置状态。】简笔人物的帧构建在装配骨架的过程中&#xff0c;每一帧都会依据基本的排除部分重新构建一个简…...

当AI推理遭遇通信瓶颈时,NIXL如何重新定义高性能数据传输架构?

当AI推理遭遇通信瓶颈时&#xff0c;NIXL如何重新定义高性能数据传输架构&#xff1f; 【免费下载链接】nixl NVIDIA Inference Xfer Library (NIXL) 项目地址: https://gitcode.com/gh_mirrors/ni/nixl 在大规模分布式AI推理场景中&#xff0c;数据传输和通信瓶颈已成为…...

在 Taotoken 平台管理账单与下载历史消费记录的便利性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在 Taotoken 平台管理账单与下载历史消费记录的便利性 对于需要将大模型 API 调用成本纳入项目预算或团队核算的开发者而言&#x…...

边缘计算是5G应用的核心平台 , 产业空间广阔

5G引入三大应用场景&#xff0c;eMBB&#xff08;高速移动通信&#xff09;、mMTC&#xff08;大规模机器通信&#xff09;、URLLC&#xff08;低时延高可靠&#xff09;&#xff0c;为克服传输网的性能瓶颈&#xff0c;边缘计算成为5G网络的核心网络技术之一。为进一步拓展运营…...