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中记录的初始位置即可。

相关推荐
报错小能手3 小时前
SwiftUI 框架 认识 SwiftUI 视图结构 + 布局
ui·ios·swift
RReality3 小时前
【Unity UGUI】InputField 输入框全解
unity·游戏引擎
南無忘码至尊3 小时前
Unity学习90天-第3天-认识触屏输入(手游基础)并完成手机点击屏幕,物体向点击位置移动
学习·unity·c#·游戏引擎·游戏开发
南無忘码至尊3 小时前
Unity学习90天-第3天-认识C# 集合与常用类并实现生成随机位置的 10 个立方体
学习·unity·c#
mxwin13 小时前
Unity URP 下抓取当前屏幕内容实现扭曲、镜子与全局模糊效果
unity·游戏引擎·shader
南無忘码至尊18 小时前
Unity学习90天-第2天-认识Unity生命周期函数并用 Update 控制物体移动,FixedUpdate 控制物理
学习·unity·游戏引擎
小林up21 小时前
【Unity URP源码阅读1】ColorGradingLUT
unity·游戏引擎
风酥糖1 天前
Godot游戏练习01-第27节-升级选项选择生效
游戏·游戏引擎·godot
郝学胜-神的一滴1 天前
[简化版 GAMES 101] 计算机图形学 04:二维变换上
c++·算法·unity·godot·图形渲染·unreal engine·cesium
南無忘码至尊1 天前
Unity学习90天-第2天-认识键盘 / 鼠标输入(PC)并实现WASD 移动,鼠标控制物体转向
学习·unity·c#·游戏开发