obsidian/笔记文件/2.笔记/在游戏运行过程,实现拖曳和缩放.md
2025-03-26 00:02:56 +08:00

3.8 KiB
Raw Permalink Blame History

#unity/日常积累

窗体会有一个图片,挂上脚本;

!Pasted image 20220425220021.png

这个脚本,有继承自,拖曳相关的;

!Pasted image 20220425220128.png

最开始的时候,设定默认值,在开始拖曳的时候,就设定一下偏移值; 然后在拖曳期间将eventData的位置信息加上偏移值信息就是新的自身的position了

!Pasted image 20220425220159.png

然后到了检测canvas画布的类

!Pasted image 20220425220915.png

还需要检测,当前鼠标是否在当前面板;

!Pasted image 20220425224433.png

!Pasted image 20220425224736.png

调用的这个方法,是跳转到这里;

!Pasted image 20220425225538.png

检测完成后,还需要判断一下,是否存在方向;

!Pasted image 20220425230114.png

默认是没有方向的,还是先检测,在当前画布模式下,鼠标的位置是否在物体里面; 然后,通过一个方法,获取到物体的四个角的值;

!Pasted image 20220425230149.png

这个获取四个角在屏幕坐标的方法虽然是包含了判断renderMode不为OverLay这个模式的情况下会怎么处理但实际上这个是无法生效的不用管

!Pasted image 20220425230518.png

然后分别计算一下鼠标的x和y跟四个角的距离差值

!Pasted image 20220425230916.png

然后,计算一下,鼠标位置,和角标的距离;

!Pasted image 20220425231101.png

还有一个,右下角的,鼠标和角标之间的距离;

!Pasted image 20220425231258.png

以上这几个返回的,都是右上,左上之类的,包含两个方向的;

除此之外,还有单独一个方向的;

!Pasted image 20220425231418.png

这个也是,返回向下方向的,然后,最终返回计算得到的方向值;

!Pasted image 20220425231517.png

可以看到前面的这个判断是鼠标Down的那个时刻 后面如果鼠标持续按下就是else部分的判断了

如果以上俩条件都满足的话就设置一个lastPos是鼠标的位置显示icon前面判断方向的时候icon的localRotation已经设置过的并且隐藏鼠标的图标

!Pasted image 20220425231636.png

前面判断了isDraging是true之后如果鼠标左键持续点击的情况就是图标的位置也是随着鼠标的位置而改变偏移值就是鼠标的位置减去前面赋值的lastPos位置

!Pasted image 20220425231941.png

然后,窗体是有定义两个宽高区间的,拖曳拉伸,不能超过这俩范围;

!Pasted image 20220425232337.png

然后,这里就是,处理拖曳窗体的方法,传参是方向和偏移量;

!Pasted image 20220425232549.png

先确认一下这个Clamp api接口是用来限制范围的

!Pasted image 20220425232707.png

继续这个Sign api接口是用来限制方向的

!Pasted image 20220425233723.png

这Abs是返回绝对值的

!Pasted image 20220425233801.png

然后就是拖曳窗体的方法先根据方向计算不同情况下的size数值

!Pasted image 20220425233619.png

计算之后通过区域限制差值计算得到新位置然后通过工具类的SetRectTransformSizeWithCurrentAnchors()方法,设置一下宽高;

x和y的数值是宽高修改之后的减半数值unity中实际拖曳就是这个效果实际操作一下就知道了

!Pasted image 20220425233912.png

具体实现:

!Pasted image 20220425234045.png

如果不是拖曳,又还是放在边缘位置,也还是修改表现即可;

!Pasted image 20220425234528.png

补充一下,父类;

!Pasted image 20220425235044.png

似乎在找单例的时候,会加锁,还没深究;

!Pasted image 20220425235708.png