120 lines
3.8 KiB
Markdown
120 lines
3.8 KiB
Markdown
#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]] |