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

120 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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]]