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

Unity UI射线检测 道具拖拽

通过PointerEventData和EventSystem实现UI的射线检测

1.调用IPointerClickHandler接口,实现方法

2.声明一个返回射线结果的List List<RaycastResult> result = new List<RaycastResult>();

3.向eventData的位置发射射线 EventSystem.current.RaycastAll(eventData, results);

4.场景中只能有一个EventSystem,因为 EventSystem.current 会返回当前场景中的 EventSystem 实例

如何实现道具拖拽

1.因为每次实现道具拖拽都是在背包中,所以先说背包实现的个人思路。创建很多格子在一个面板下,通过List<Img>Slots存储所有格子的img,调用List.Addrange方法,放入Content节点下的所有格子,这样我们就可以拿到格子的数量,并且Slots[i].Transform就可以代表预制体的父节点,将道具创建在这个格子下。在刷新的时候,通过foreach去便利该List,判断当他的childCount>0,调用DestroyImmediate立即清理掉每个格子下的子物体。

2.道具拖拽,调用三个接口IBeginDragHandler, IEndDragHandler, IDragHandler,实现方法

第一个是当移动时会调用一次

第二个是鼠标在拖动物品发生位置变化时每帧都会调用

第三个是松开时会调用一次

3.如果是按照上面的思路,我们在拖拽的时候会产生一个问题,因为格子的渲染层级问题,我们在拖拽道具的时候,是会被后渲染的格子挡住的,所以我们在拖拽的时候,应该将他放入一个渲染更靠后的Gameobject中即可。

4.关键写法:一般都是在面板中去for循环,调用子UI实例化,此时我们要把父节点传入子UI的初始化中。这样我们就可以通过transform.parent = lastParent = parent(传入的父节点)设置当前的父节点,并且记录当前的父节点。

在IBeginDragHandler中:Vector2记录当前UI所在的位置,如果道具拖拽到不必要的区域,自动归位的时候会用到,并且把该UI的父节点就可以设置为Gameobject了,这样拖拽的时候就不会被遮挡。

在IDragHandler中:拖拽过程中,我们需要让物体随着鼠标移动, rectTransform.anchoredPosition += eventData.delta;

eventData.delta代表了鼠标的位移量 

在IEndDragHandler中:最关键的一步也就是松鼠标这里,这时候就可以用到之前记录的父节点了,然后我们根据需求去判断就可以了,比如物体合成,A物体和B物体的标签是否一致(如果射线检测的物体顺序不好控制,也可以先将A物体的标签在移动时就换了,在放置时再换回去);物体交换位置,那就通过C = A A = B B = C的方式交换;物体到了不该放的位置,调用Begin中记录的初始位置即可。 


http://www.kler.cn/a/407153.html

相关文章:

  • HTB:Buff[WriteUP]
  • C语言的文件函数
  • 深入理解索引(一)
  • [论文阅读] 异常检测 Deep Learning for Anomaly Detection: A Review(三)总结梳理-疑点记录
  • MongoDB的常用命令(数据库操作、集合操作、文档操作)
  • 运维团队3D可视化智能机房管理方案
  • 网络安全与加密
  • Spring Boot 整合 Prometheus 实现资源监控
  • 全面提升系统安全:禁用不必要服务、更新安全补丁、配置防火墙规则的实战指南
  • 鸿蒙开发-音视频
  • AI赋能 Python编程之2. 从构思到优化:用AI快速实现Python项目
  • 【多线程-第一天-多线程的执行原理-多线程的优缺点-主线程 Objective-C语言】
  • Arcpy 多线程批量重采样脚本
  • 11 —— 打包模式的应用
  • 一站式学习:害虫识别与分类图像分割
  • 汽车加油行驶问题-动态规划算法(已在洛谷AC)
  • 埃文科技携手河南企业代表团亮相第十九届广州中博会
  • 移门缓冲支架:为好梦加分
  • 【青牛科技】电流模式PWM控制器系列--D4870
  • HTML通过JavaScript获取访问连接,IP和端口
  • 力扣—面试题 17.14. 最小K个数
  • 多目标优化算法:多目标河马优化算法(MOHOA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码
  • C++中类的继承
  • 25.UE5时间膨胀,慢动作,切换地图,刷BOSS
  • 使用flink编写WordCount
  • 高频面试题(含笔试高频算法整理)基本总结回顾23