跳转至专题目录

专题推荐文章:

  1. 温故知新——RectTransform成员属性的再认识
  2. unity Scene View扩展之编辑器扩展总结
  3. Unity获取鼠标点击ui GameObject

本系列目录

  1. localPosition与anchoredPosition转化之瞎猫找死耗子
  2. localPosition与anchoredPosition转化
  3. 揭秘!anchoredPosition的几何意义!
  4. 证·RectTransform里的localPosition就是pivot的位置
  5. 温故知新——RectTransform成员属性的再认识✩✰✪✫✬✭✮✯★强烈推荐,个人力作!✩✰✪✫✬✭✮✯★

文中存在一些纰漏,更正之后的文档在

砂糖酱:温故知新——RectTransform成员属性的再认识​zhuanlan.zhihu.com


首先很感谢这篇文章,让我对RectTransform里面的各个属性有了很深了解,建议对RectTransform不是很了解的都可以读一下。

Unity进阶技巧 - RectTransform详解​www.jianshu.com

感谢完之后,进入我们的推理环节。

至于推理的起点,就是我们都熟知的事情,分别有以下6条:

       // offsetMin, offsetMax, sizeDelta, pivot, anchoredPosition 之间的关系public Vector2 offsetMin{get{return anchoredPosition - Vector2.Scale(sizeDelta, pivot);}set{Vector2 offset = value - (anchoredPosition - Vector2.Scale(sizeDelta, pivot));sizeDelta -= offset;anchoredPosition += Vector2.Scale(offset, Vector2.one - pivot);}}public Vector2 offsetMax{get{return anchoredPosition + Vector2.Scale(sizeDelta, Vector2.one - pivot);}set{Vector2 offset = value - (anchoredPosition + Vector2.Scale(sizeDelta, Vector2.one - pivot));sizeDelta += offset;anchoredPosition += Vector2.Scale(offset, pivot);}}

  1. offsetMin, offsetMax, sizeDelta, pivot, anchoredPosition 之间的关系(见上方代码,源于unity现在开源的代码中)(这个就是万恶之源的关系式
  2. sizeDelta=offsetMax - offsetMin(见上方链接文章中的五、sizeDelta详解)
  3. offsetMin = UI左下角坐标-anchorMin锚点坐标(见上方链接文章中的四、offsetMin和offsetMax详解)
  4. offsetMax= UI右上角坐标-anchorMax锚点坐标(见上方链接文章中的四、offsetMin和offsetMax详解)
  5. 除了上面链接提到的,和上面几条提到几个属性变量,RectTransform里面还有一个rect(Rect),存着这个UI的起点坐标、最大坐标、宽高(毕竟现在知道了sizeDelta并不是表示UI的真实大小了)
  6. pivot点就是我们UI的中心点,它的位置,就表示UI对象的位置;子节点的pivot,与父节点的pivot之间的坐标插值,就是当前UI的localPosition(我自己推理证明的,证明方法下一篇文章写吧)(用的就是这个,将localPosition和anchoredPosition联系在一起的

我们已经理清楚了RectTransform的各个属性变量的关系了,那么现在就反过来,从第6条开始,一步一步往第一条的关系式里面靠。

白色为子节点,黑色为父节点
子节点RectTransform

一、通过anchorMin和rect,求得锚点左下角锚点(AnchorMin)的坐标

1、anchorMin:表示锚点左下点在父节点位置的百分比,0-1之间

2、由anchorMin的定义可以知道,要求出这个位置,就需要用到父节点的真实大小了,即parentRectTransform.rect

为了方便表示,将AnchorMin改为(0.1f, 0.1f)

3、根据定义,求得偏移量为 offset = Vector2.Scale(rect.anchorMin, parentRect.rect.size); // 父节点的长宽 * anchorMin这个百分比。

4、最后, 将这个偏移量加上parentRect.min这个坐标,即可以得到左下角锚点AnchorMin的坐标(在父节点坐标系中)

Vector2 anchorMinPos = parentRect.rect.min + Vector2.Scale(rect.anchorMin, parentRect.rect.size);

5、右上角锚点AnchorMax同理(有兴趣的可以自己证明):

 Vector2 anchorMaxPos = parentRect.rect.max - Vector2.Scale(Vector2.one - rect.anchorMax, parentRect.rect.size);

二、通过rect和localPosition,求出当前节点左下角位置

1、众所周知,Rect里面有一个min,可以表示左下角的坐标(这个坐标的坐标系为当前UI gameObject的)

2、这时候我们会发现,求出来的左下角锚点与UI左下角的坐标系不一样,需要进行坐标系转化

3、理所当然的,子节点坐标系转父节点坐标系简单一点,只需要在子节点坐标系下加一个localPosition,即可转换,所以我们求出来左下角坐标为:

Vector2 rectMinPos = rect.rect.min + localPosition2D;

4、右上角坐标同理:

Vector2 rectMaxPos = rect.rect.max + localPosition2D;

三、需要推理计算的步骤已经完了,剩下的就代公式就好了

// 1、求offsetMin, offsetMax:
Vector2 offsetMin = rectMinPos - anchorMinPos;
Vector2 offsetMax = rectMaxPos - anchorMaxPos;// 2、求sizeDelta Vector2 sizeDelta = offsetMax - offsetMin;// 3、通过offsetMin 求anchoredPosition (最后一步啦)
Vector2 anchoredPositionByMin = offsetMin + Vector2.Scale(sizeDelta, rect.pivot); // 4、因为从源码里面可以看到,除了offsetMin ,offsetMax也可以求出anchoredPosition (这两个2选1就好了)
Vector2  anchoredPositionByMax = offsetMax - Vector2.Scale(sizeDelta, Vector2.one - pivot);

四、总结

然后将上面所有流程统一起来,就可以得到下面代码啦

     RectTransform rect = GetComponent<RectTransform>();RectTransform parentRect = transform.parent.GetComponent<RectTransform>();Vector2 GetAnchoredPositionByLocalPosition(){// 通过OffsetMin、OffsetMax,将anchoredPosition和localPosition联系起来Vector2 localPosition2D = new Vector2(rect.localPosition.x, rect.localPosition.y);Vector2 anchorMinPos = parentRect.rect.min + Vector2.Scale(rect.anchorMin, parentRect.rect.size);Vector2 rectMinPos = rect.rect.min + localPosition2D;Vector2 offsetMin = rectMinPos - anchorMinPos;Vector2 anchorMaxPos = parentRect.rect.max - Vector2.Scale(Vector2.one - rect.anchorMax, parentRect.rect.size);Vector2 rectMaxPos = rect.rect.max + localPosition2D;Vector2 offsetMax = rectMaxPos - anchorMaxPos;Vector2 sizeDelta = offsetMax - offsetMin;Vector2 anchoredPosition = offsetMin + Vector2.Scale(sizeDelta, rect.pivot); return anchoredPosition;}

五、后记

我们这篇文章只是了解一下localPosition和anchoredPosition之间的转化关系,毕竟疑惑了我好久的一个问题,网上也一直没找到答案,于是就自己动手去了解、推理、计算了。

不过当小数点过多的时候,最后几位会有误差,毕竟感觉可能unity底层与c#层的计算精度可能有区别,个人就认为允许范围内了。

见GetAnchoredPosition组件,上面为直接拿到的数据,下面为计算出来的数据

当然我们实际开发过程中并不需要调用这么一个函数进行转化,直接rect.localPostion就能拿到localPosition,rect.anchroedPostion就能拿到anchroedPostion~~

再次感谢并推荐这篇文章,帮助真的很大,有种茅塞顿开的感觉

Unity进阶技巧 - RectTransform详解​www.jianshu.com

后再推荐一下我做这个的github工程

https://github.com/Zhunity/Position​github.com

PS:

毕竟是我个人自己逆推出来的,没有测试到所有情况,如果发现错误的同学,也希望指出来让我再推理一下~~~


感谢看完,文中存在一些纰漏,更正之后的文档在

砂糖酱:温故知新——RectTransform成员属性的再认识​zhuanlan.zhihu.com

转化百分比_localPosition与anchoredPosition的转化关系相关推荐

  1. R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表、对转化为长表的数值数据列进行离散化、pivot_wider将数据转化为宽表

    R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表.对转化为长表的数值数据列进行离散化.pivot_wider将数据转化为宽表 ...

  2. pandas把dataframe的数据列转化为索引列实战:单列转化为索引、多列转化为复合索引

    pandas把dataframe的数据列转化为索引列实战:单列转化为索引.多列转化为复合索引 目录

  3. revit常用土建软件【桩转化】功能,CAD识别转化

    revit常用土建软件[桩转化]功能,CAD识别转化,大家都知道revit建模时,一般都是先完成基础的建模,我们在revit土建软件建模过程中,会将CAD导入的方法以此来提高软件的建模效率. 今天就和 ...

  4. php中的汉字转化为拼音,简繁体转化

    php中的汉字转化为拼音,简繁体转化 本文章,是我自己用到汉字转化为拼音,简体繁体转化的情况,所以在这里总结下,如有错误,欢迎大家帮我指正,因为我也在学习中-.. 汉字转化为拼音 获取汉字首字母 简体 ...

  5. 魔兽地图编辑器插件 YDWE 触发器函数转化成jass代码 以及转化为自定义文本后重新转化为触发器函数

    魔兽地图编辑器插件 YDWE 触发器函数(文字)转化成jass代码 以及转化为自定义文本后重新转化为触发器函数

  6. Json转换利器Gson之实例一-简单对象转化和带泛型的List转化

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: h ...

  7. bim土建翻模【承台转化】功能,CAD识别转化

    bim土建翻模[承台转化]功能,CAD识别转化.利用BIM建模助手的土建插件,实现高效的承台转化,提高翻模效率!在bim土建翻模中,桩模型建立后,接下来就需要建立承台,但是承台的特点是尺寸,厚度不一, ...

  8. 转化百分比_小秘诀教你如何快速提升大众点评访客转化率!

    大众点评访客转化率是指真实到你店铺消费的用户占到在大众点评上面浏览你店铺用户的百分比,比如有100个用户在大众点评上面访问了你的店铺,这100个用户当中有10个到你店铺消费了,那么转化率就是10%.转 ...

  9. php把数字转化字符串,php中把数字转化为字符串的方法有哪些?-PHP问题

    php中把数字转化为字符串的办法有哪些? php中把数字转化为字符串的办法: PHP的数据类型转换属于强迫转换,转换类型为(string):转换成字符串 转换形式: intval() floatval ...

最新文章

  1. 计算机网络模型到底是七层?五层?四层?
  2. 【java 性能优化实战】1 理论分析:性能优化,有哪些衡量指标、性能优化的技术手段
  3. Castle DynamicProxy基本用法(AOP)
  4. Send data format set as XML
  5. CoreCLR源码探索(三) GC内存分配器的内部实现
  6. Spark从HDFS上读取JSON数据
  7. rshd: 0826-813 Permission is denied.
  8. 微课|中学生可以这样学Python(例11.3):tkinter通信录管理系统3
  9. OpenCV中的级联分类器Cascade Classifier(面部识别)
  10. 计算年龄案例(JS)
  11. 移动设备尺寸规范汇总(转)
  12. somachine3.1安装
  13. PS实战操作之蒙版、路径
  14. psn注册什么服务器,psn港服注册图文教程
  15. java接入支付宝api实现支付宝手机扫码登录
  16. IETester汉化文件下载
  17. 计算机word基础操作知识点,Office基础和计算机操作基础的知识点(一)
  18. InnoDB中的页合并与分裂
  19. 使用VSCode插件CodeRunner一键编译运行Java
  20. 计算机春考,春考计算机模拟试卷.ppt

热门文章

  1. 哈啰出行回应单车违规投放:将尽快缴纳罚金 积极整改
  2. SpaceX载人龙飞船Crew Dragon成功完成首飞返回地球!
  3. 不输3000元旗舰!红米Note 7 Pro堆料有点狠
  4. 从折叠屏到AR 三星Galaxy新品预热宣传片大招频现
  5. 29岁女程序员感慨:硕士学历,脱单比找工作买房还难,有同感么?
  6. 为2440搭建NFS开发环境【ZT】
  7. dalvik.system.PathClassLoader[DexPathList[[zip file /data/app/comda.xfdsafda.activdity-1/base.apk]
  8. android每日定时推送通知,Android使用JobScheduler定期推送本地通知实例代码
  9. action对象 java_struts2通过action返回json对象
  10. GB28181协议中的事件系统设计