Unity3D RectTransform 成员 localPosition 和 anchoredPosition 详解

23 篇文章 3 订阅
13 篇文章 1 订阅

1.RectTransform.localPosition (本地位置)

    RectTransform.localPosition 顾名思义就是表示相对于父元素的位置,但是它不同于Transform.localPosition ,它是一个像素为单位的坐标,这个像素坐标系的原点依然是 RectTransform.parent.position,但是相较于Transform.localPosition 多了一个Unit(Unity度量单位)到像素的转换过程,正交相机下的换算方法如下(透视相机需通过视场角来推倒):

   ( RectTransform.position -  RectTransform.parent.position) * (Screen.currentResolution.height / (Camera.main.orthographicSize*2))= localPosition

注意,虽然UI元素是绑定在Canvas上的,但是UI元素的Z轴依然有效,同样会被换算成像素坐标,并不是无意义的,如果你用透视相机可以看到效果,渲染时由于UI元素RenderQueue 都是Transparent 所以遵循的牌序方式不一样,同时UI元素共享Canvas的 Sorting Layer/Order in Layer 设置,并在牌序规则的最后,遵循先父后子的渲染规则,而不是由远及近(关于牌序规则可以查看文章一句话解释Unity渲染牌序)。

     另外重要的一点是 RectTransform.position 并不是直接对应到UI元素的矩形范围的中心,其中有一层映射关系,由RectTransform.pivot 决定  RectTransform.position 的位置对应到 UI矩形范围中具体的某一点,比如如果将RectTransform.pivot 设置为(0,0) 那么这个UI元素的RectTransform.position 的位置就代表了这个UI元素矩形范围的最左下角这一点的位置。从下图的例子也很好的说明了privot 与position 之间的关系

 

2.RectTransform.anchoredPosition(锚点坐标系位置)

   anchoredPosition与localPosition是完全不同的,我常看到有人用anchoredPosition当localPosition来用,这个是完全错误的,首先 anchoredPosition 不是以父元素的 position 为原点的坐标系,anchoredPosition的原点是UI元素的锚点,这个锚点的位置是根据父元素的矩形范围和自身的AnchorMin,AnchorMax,pivot决定的,这个转换关系很复杂,分为两种情况

1.AnchorMin.x和AnchorMax.x值相同,这个时候的锚点x轴上的位置就是 父元素矩形范围x轴上的等比取值,比如如果AnchorMin.x==AnchorMax.x==0,则这个时候锚点的 x轴坐标就是父元素矩形范围的最左边。而如果AnchorMin.x==AnchorMax.x==1, 则这个时候锚点的 x轴坐标就是父元素矩形范围的最右边。(y轴同理)

如下图

2.AnchorMin.x和AnchorMax.x值不相同,这个时候的锚点x轴上的位置就是 父元素矩形范围x轴上,AnchorMin.x和AnchorMax.x按比例所划定范围中,子元素 pivot.x 设定值的等比取值,比如如果AnchorMin.x=0.25,AnchorMax.x=0.75 则首先在父元素的矩形范围画出0.25至0.75这一段,然后根据子元素pivot.x 的设置,比如这里设置为0.5 则锚点x轴的位置就是父元素矩形范围x轴0.5这个位置,如果这里设置为1.0 则锚点x轴的位置就是父元素矩形范围x轴0.75这个位置,(y轴同理)如下图:

 

在确定了锚点位置后,然后计算出子元素的position位置与锚点位置的插值并换算出像素值,即是anchorPosition的位置.

 

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中,transform.localPosition是指一个游戏对象相对于其父对象的本地坐标位置。\[1\]如果一个GameObject有一个parent,并且这个parent GameObject的localScale是(2.0f,2.0f,2.0f),那么该GameObject的localPosition将会乘以父对象的localScale来计算其world position。\[1\]换句话说,localPosition是在没有考虑scale计算的情况下进行的,为了解决这个问题,Unity提供了Translate函数来进行移动操作。\[1\]所以,正确的做法是使用transform.Translate来移动对象,例如transform.Translate(10.0f * Time.deltaTime, 0.0f, 0.0f)。\[1\]另外,如果想获取父物体的子物体的transform变量,可以使用父物体的transform.GetChild函数来获取。\[2\]在代码中,可以使用transform.GetChild(index)来获取指定索引的子物体的transform变量。\[2\]另外,如果想在局部坐标系下移动一个角色控制器(Character Controller),可以使用m_CharacterController.Move函数,并传入一个局部向量来指定移动方向和速度。\[3\]例如,m_CharacterController.Move((m_CharacterControllerTransform.forward * v + m_CharacterControllerTransform.right * h) * Time.deltaTime * speed)可以实现在局部坐标系下的移动。\[3\] #### 引用[.reference_title] - *1* [[unity基础教程]操作transform.localPosition的时候请小心](https://blog.csdn.net/hany3000/article/details/9316423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Unity --- Transform类](https://blog.csdn.net/qq_51947882/article/details/126481986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【UnityTransform组件localPosition局部坐标修改问题](https://blog.csdn.net/qq_39574690/article/details/124784032)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值