【Unity3D】UGUI的anchoredPosition锚点坐标

本文直接以实战去理解锚点坐标,围绕着将一个UI移动到另一个UI位置的需求进行说明。

(anchoredPosition)UI锚点坐标,它是UI物体的中心点坐标,以UI物体锚点为中心的坐标系得来,UI锚点坐标受锚点(Anchors Min、Max)和 中心点Pivot影响。

针对锚点坐标详细说明

可直接查看RectTransform组件的Pos X和Pos Y得知锚点情况,但是只有这9种锚点分布才允许直接查看。

 其他7种锚点布局情况则是

剩下3个锚点布局情况对锚点的影响一样,都是以父物体的中心点为锚点计算锚点坐标。

上面3个都是和下面这个锚点布局一样,都是能直接拿到PosX PosY是(-133,62)的

实战例子

Debug.Log("btn2.anchoredPosition:" + btn2.anchoredPosition);
Debug.Log("hand.anchoredPosition:" + hand.anchoredPosition);
//不能正常移动,除非2个物体都在相同的父节点以及锚点相同
hand.anchoredPosition = btn2.anchoredPosition;

 需求是将hand物体移动到btn2物体上,如上图实战会失败。

原因:锚点不相同(虽然父物体一样)
解决:保证锚点相同、父物体相同

//1.保证父节点相同
hand.parent = btn2.parent;
//2.保证锚点相同
hand.anchorMin = btn2.anchorMin;
hand.anchorMax = btn2.anchorMax;
//能正常移动
hand.anchoredPosition = btn2.anchoredPosition;

缺点:当存在父物体是一个布局组件时(或父物体需操控子物体位置时),hand的位置会被控制无法正常设置到btn2位置。

当我们继续使用【保证锚点相同、父物体相同】来移动hand物体时,会因为布局组件而改变了hand物体位置。

解决思路1:给hand物体加LayoutElement组件忽略布局组件的影响。

解决思路2:不进行hand物体转到btn1物体的父物体下,hand物体始终在Canvas根节点下,然后去获取btn1物体在Canvas根节点下的锚点坐标(反过来理解就是逻辑上将btn1物体放到了Canvas根节点然后取锚点坐标,并且锚点坐标是相对Canvas坐标系中心点的坐标)

//1.关键点btn1.position已经正确赋值后才进行如下
//比如 btn1在布局组件之下,需要先进行一次强制刷新来保证btn1位置正常
//LayoutRebuilder.ForceRebuildLayoutImmediate(layoutRectTransform);//2.保证hand物体的锚点布局是以父物体中心点为坐标系(因为下面转锚点的空间是以父物体中心点的)
hand.anchorMin = new Vector2(0.5f, 0.5f);
hand.anchorMax = new Vector2(0.5f, 0.5f);//3.将btn1世界坐标转屏幕坐标
Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(Camera.main, btn1.position);//4.屏幕坐标转相对于localRect(即Canvas)中心点的锚点坐标
Vector2 localPos = Vector2.zero;
RectTransform handParentRectTransform = hand.parent.GetComponent<RectTransform>();
RectTransformUtility.ScreenPointToLocalPointInRectangle(handParentRectTransform, screenPos, Camera.main, out localPos);hand.anchoredPosition = localPos;

这步操作很关键:LayoutRebuilder.ForceRebuildLayoutImmediate(layoutRectTransform);
需要将所有父节点的布局组件强制刷新一遍来保证UI的世界坐标正常

public void ForceRebuildLayoutImmediate(Transform transform)
{LayoutGroup[] layoutGroups = transform.GetComponentsInParent<LayoutGroup>();if (layoutGroups != null && layoutGroups.Length > 0){foreach (var v in layoutGroups){LayoutRebuilder.ForceRebuildLayoutImmediate(v.GetComponent<RectTransform>());}}
}

其次就是RectTransformUtility.ScreenPointToLocalPointInRectangle是将屏幕坐标转到以第一个参数RectTransform为中心的锚点坐标,实战则是获取到btn1的屏幕坐标后将其转到以hand物体的父物体(Canvas) 为中心的锚点坐标,然后我们就能直接用该坐标赋值给hand物体,实现将hand物体移动到btn1物体位置效果。

题外:

世界坐标,能实现需求将hand移动到btn1的位置,但如果要加偏移量之类的世界坐标不直观理解

//此前还需保证布局组件相关的刷新,与锚点坐标情况是一样的hand.position = btn1.position;

注意事项

为什么UGUI获取布局组件下的UI坐标(无论是锚点坐标还是世界坐标等等)都可能出现非常大的误差,甚至说是完全不正确。
因为布局组件有延迟性, 你必须使用LayoutRebuilder.ForceRebuildLayoutImmediate(layoutRectTransform); 在获取坐标之前进行强制刷新布局组件,保证布局组件下的UI坐标是正常的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)

背景 家人有一台夏新多功能 视频播放器(夏新多功能 视频播放器),用来播放广场舞。下载了一些广场舞视频, 只有部分视频可以播放,其他视频均无法播放,判断应该不是帧速率和数据速率的限制, 分析可能是播放器不支持帧高度大于720的视频。由于视频文件较多,需要借助视频编…

自动化xpath定位元素(附几款浏览器xpath插件)

在 Web 自动化测试、数据采集、前端调试中&#xff0c;XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大&#xff0c;但面对复杂 DOM 结构时&#xff0c;XPath 仍然更具灵活性。因此&#xff0c;掌握 XPath&#xff0c;不仅能提高自动化测试的稳定性&#xff0c;还能在爬…

ASP.NET Core 如何使用 C# 向端点发出 POST 请求

使用 C#&#xff0c;将 JSON POST 到 REST API 端点&#xff1b;如何从 REST API 接收 JSON 数据。 本文需要 ASP .NET Core&#xff0c;并兼容 .NET Core 3.1、.NET 6和.NET 8。 要从端点获取数据&#xff0c;请参阅本文。 使用 . 将 JSON 数据发布到端点非常容易HttpClien…

【AI学习】关于 DeepSeek-R1的几个流程图

遇见关于DeepSeek-R1的几个流程图&#xff0c;清晰易懂形象直观&#xff0c;记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》&#xff0c; 文章链接&#xff1a;https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…

CSS 实现下拉菜单效果实例解析

1. 引言 在 Web 开发过程中&#xff0c;下拉菜单是一种常见且十分实用的交互组件。很多前端教程都提供过简单的下拉菜单示例&#xff0c;本文将以一个简洁的实例为出发点&#xff0c;从 HTML 结构、CSS 样式以及整体交互逻辑三个层面进行详细解析&#xff0c;帮助大家理解纯 C…

网络安全溯源 思路 网络安全原理

网络安全背景 网络就是实现不同主机之间的通讯。网络出现之初利用TCP/IP协议簇的相关协议概念&#xff0c;已经满足了互连两台主机之间可以进行通讯的目的&#xff0c;虽然看似简简单单几句话&#xff0c;就描述了网络概念与网络出现的目的&#xff0c;但是为了真正实现两台主机…

【Windows】PowerShell 缓存区大小调节

PowerShell 缓存区大小调节 方式1 打开powershell 窗口属性调节方式2&#xff0c;修改 PowerShell 配置文件 方式1 打开powershell 窗口属性调节 打开 CMD&#xff08;按 Win R&#xff0c;输入 cmd&#xff09;。右键标题栏 → 选择 属性&#xff08;Properties&#xff09;…

GitCode 助力 Easy-Es,革新 Elasticsearch 开发体验

项目仓库&#xff08;点击阅读原文链接可直达&#xff09; https://gitcode.com/dromara/easy-es 项目背景&#xff1a;填补 Elasticsearch ORM 框架空白 在 Java 开发领域&#xff0c;Excel 和 Elasticsearch 的代码编写难度一直名列前茅&#xff0c;尤其是 Elasticsearch&a…

Vue(7)

一.Vuex &#xff08;1&#xff09;概述 1.是什么 vuex是一个vue的状态管理工具&#xff0c;状态就是数据&#xff0c;可以帮助管理vue通用的数据&#xff08;多组件共享的数据&#xff09; 2.场景 ①某个状态在很多个组件来使用&#xff08;个人信息&#xff09; ②多个组…

如何把邮件批量导出到本地

最近遇到邮箱满了的问题&#xff0c;需要把邮件批量导出到本地&#xff0c;然后清空邮箱。 问题是这个邮箱的官网&#xff0c;没有批量导出按钮&#xff0c;比较麻烦&#xff1b;总不能一封一封下载到本地&#xff0c;上万的。 找到了一个好用的工具&#xff0c;Mozilla Thun…

渗透利器工具:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.&#xff08;主动扫描被动扫描&#xff09; Burp Suite 和 Xray 联合使用&#xff0c;能够将 Burp 的强大流量拦截与修改功能&#xff0c;与 Xray 的高效漏洞检测能力相结合&#xff0c;实现更全面、高效的网络安全测试&#xff0c;同时提升漏…

如何将3DMAX中的3D文件转换为AutoCAD中的2D图形?

大家好,今天我们来探讨一下如何将3DMAX中的3D文件转换为AutoCAD中的2D图形。无论是出于设计交流、施工准备还是其他实际需求,这种转换在工程设计领域都是一项非常实用的技能。接下来,我将为大家详细介绍几种实现这一转换的方法,帮助大家轻松跨越3D与2D设计之间的鸿沟。让我…

Git 分布式版本控制工具使用教程

1.关于Git 1.1 什么是Git Git是一款免费、开源的分布式版本控制工具&#xff0c;由Linux创始人Linus Torvalds于2005年开发。它被设计用来处理从很小到非常大的项目&#xff0c;速度和效率都非常高。Git允许多个开发者几乎同时处理同一个项目而不会互相干扰&#xff0c;并且在…

国产编辑器EverEdit - 迷你查找

1 迷你查找 1.1 应用场景 某些场景下&#xff0c;用户不希望调出复杂的查找对话框&#xff0c;此时可以使用迷你查找窗口。 1.2 使用方法 选择主菜单查找 -> 迷你查找&#xff0c;或使用快捷键Ctrl Alt F&#xff0c;会在右上角弹出迷你查找窗口&#xff0c;如下图所示…

攻防世界32 very_easy_sql【SSRF/SQL时间盲注】

不太会&#xff0c;以后慢慢看 被骗了&#xff0c;看见very_easy就点进来了&#xff0c;结果所有sql能试的全试了一点用都没有 打开源代码发现有个use.php 好家伙&#xff0c;这是真的在考sql吗...... 制作gopher协议的脚本&#xff1a; import urllib.parsehost "12…

opc da 服务器数据 转 EtherCAT项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 应用条件 4 查看OPC DA服务器的相关参数 5 配置网关采集opc da数据 6 启动EtherCAT从站转发采集的数据 7 在服务器上运行仰科OPC DA采集软件 8 案例总结 1 案例说明 在OPC DA服务器上运行OPC DA client软件查看OPC DA服务器的相…

从基础到人脸识别与目标检测

前言 从本文开始&#xff0c;我们将开始学习ROS机器视觉处理&#xff0c;刚开始先学习一部分外围的知识&#xff0c;为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本&#xff0c;系统采用Ubuntu20.04&#xff0c;ROS采用noetic。 颜…

百度高德地图坐标转换

百度地图和高德地图的侧重点不太一样。同样一个地名&#xff0c;在百度地图网站上搜索到的地点可能是商业网点&#xff0c;在高德地图网站上搜索到的地点可能是自然行政地点。 高德地图api 在高德地图中&#xff0c;搜索地名&#xff0c;如“乱石头川”&#xff0c;该地名会出…

Visual Studio踩过的坑

统计Unity项目代码行数 编辑-查找和替换-在文件中查找 查找内容输入 b*[^:b#/].*$ 勾选“使用正则表达式” 文件类型留空 也有网友做了指定&#xff0c;供参考 !*\bin\*;!*\obj\*;!*\.*\*!*.meta;!*.prefab;!*.unity 打开Unity的项目 注意&#xff1a;只是看&#xff0…

Vue3+codemirror6实现公式(规则)编辑器

实现截图 实现/带实现功能 插入标签 插入公式 提示补全 公式验证 公式计算 需要的依赖 "codemirror/autocomplete": "^6.18.4","codemirror/lang-javascript": "^6.2.2","codemirror/state": "^6.5.2","cod…