「Unity3D」UGUI运行时设置元素的锚点Anchor,维持元素Rect的显示不变,即待在原处

ops/2025/3/19 1:40:42/

在编辑器中,通过设置Raw edit mode,可以切换两种,元素锚点的改变模式:

  • 一种是锚点单独改变,即:不开启原始模式,保持原样,改变anchoredPositionsizeDelta
  • 一种是锚点联动显示,即:开启原始模式,不保持原样,不改变anchoredPositionsizeDelta

原理很简单,anchoredPositionsizeDelta都是相对于锚点Anchor的,所以Anchor变动,元素rect保持原样,就需要改变posdelta,而元素rect跟着变动,就可以维持posdelta不变。

那么,在运行时用代码设置anchorMinanchorMax,只有联动显示的模式,即相当于开启原始模式——不改变anchoredPositionsizeDelta,改变元素rect的显示。

但有时候,我们需要只改变锚点,而保持rect显示不变——这是利用锚点适配不同分辨率后的结果——这样其父类的改变,就可以不影响子类的缩放,如:将子类锚点设置为中心点。

解决方案,就是用offsetMinoffsetMax,来反向抵消anchorMinanchorMax的变化,从而维持元素rect的显示不变。

代码实现如下:

/// <summary>
/// Set the anchorMin [v2] without changing the [rectTransform] display.
/// Assume [rectTransform] has a parent, because the root is rarely operated on.
/// </summary>
public static void SetAnchorMinOnly(this RectTransform rectTransform, in Vector2 v2)
{var offsetOriginal = rectTransform.anchorMin - v2;if (offsetOriginal == Vector2.zero){Debug.LogWarning($"[SetAnchorMinOnly]: The [v2 = {v2}] is the same as the [anchorMin].");return;}else if (offsetOriginal.x == 0.0f){Debug.LogWarning($"[SetAnchorMinOnly]: The [v2.x = {v2.x}] is the same as the [anchorMin.x].");rectTransform.SetAnchorMinYOnly(v2.y);return;}else if (offsetOriginal.y == 0.0f){Debug.LogWarning($"[SetAnchorMinOnly]: The [v2.y = {v2.y}] is the same as the [anchorMin.y].");rectTransform.SetAnchorMinXOnly(v2.x);return;}rectTransform.anchorMin = v2;var parentSize          = (rectTransform.parent as RectTransform).rect.size;rectTransform.offsetMin = parentSize * offsetOriginal;
}  /// <summary>
/// Set the anchorMax [v2] without changing the [rectTransform] display.
/// Assume [rectTransform] has a parent, because the root is rarely operated on.
/// </summary>
public static void SetAnchorMaxOnly(this RectTransform rectTransform, in Vector2 v2)
{var offsetOriginal = rectTransform.anchorMax - v2;if (offsetOriginal == Vector2.zero){Debug.LogWarning($"[SetAnchorMaxOnly]: The [v2 = {v2}] is the same as the [anchorMax].");return;}else if (offsetOriginal.x == 0.0f){Debug.LogWarning($"[SetAnchorMaxOnly]: The [v2.x = {v2.x}] is the same as the [anchorMax.x].");rectTransform.SetAnchorMaxYOnly(v2.y);return;}else if (offsetOriginal.y == 0.0f){Debug.LogWarning($"[SetAnchorMaxOnly]: The [v2.y = {v2.y}] is the same as the [anchorMax.y].");rectTransform.SetAnchorMaxXOnly(v2.x);return;}rectTransform.anchorMax = v2;var parentSize          = (rectTransform.parent as RectTransform).rect.size;rectTransform.offsetMax = parentSize * offsetOriginal;
}    


http://www.ppmy.cn/ops/166916.html

相关文章

【漫话机器学习系列】139.标量(Scalars)

标量&#xff08;Scalars&#xff09;概述 1. 什么是标量&#xff1f; 在数学和计算机科学中&#xff0c;标量&#xff08;scalar&#xff09; 是一种最基本的数据类型&#xff0c;它指的是单个数值&#xff0c;如 4 或 4.02。标量与向量&#xff08;vector&#xff09;、矩阵…

在vue项目中,使用Patch请求,实现根据id修改某张发票的日结状态

目录 前言 一.问题描述 二.后端实现 1.分析 2.检查后端拦截器&#xff0c;看看是否允许接收Patch类型的请求 3.编写Dto 4.编写controller层 5.编写service层 6.mapper层 7.使用apifox&#xff0c;测试后端接口的可用性 三.前端实现 1.封装api&#xff08;本质是ax…

2025深圳国际数字能源展全球招商启动,聚焦能源产业数字化转型

近日&#xff0c;2025深圳国际数字能源展组委会正式宣布&#xff0c;展会将于9月18 - 21日在深圳会展中心盛大举行&#xff0c;目前全球招商已全面启动。该展会旨在汇聚全球数字能源领域的前沿技术与创新成果&#xff0c;推动能源产业的数字化转型&#xff0c;助力构建绿色、高…

网络华为HCIA+HCIP数据链路层协议-以太网协议

以太网协议 以太网是当今现有局域网(Local Area Network,LAN)采用的最通用的通信协议标准&#xff0c;该标准定义了在局域网中采用的电缆类型和信号处理方法。以太网是建立在CSMA/CD(Carrier Sense Multiple Access/Collision Detection,载波监听多路访问/冲突检测)机制上的广…

人工智能与人的智能,改变一生的思维模型分享【4】决策树

决策树&#xff08; DECISION TREE&#xff09; 一般由一个决策图和若干可能的结果组成。是一种通过罗列解题的关键步骤以及各步骤发生的条件和结果&#xff0c;由此来创建到达目标的规划。 我们很早就知道有一个方法&#xff0c;叫做当你苦闷、纠结的时候&#xff0c;把你的所…

设计模式,持续更新

创建型 简单工厂 public interface Product{}public class ConcreteProduct implements Product { } public class ConcreteProduct1 implements Product { } public class ConcreteProduct2 implements Product { } public class SimpleFactory{public Product createProduc…

TCP/IP四层网络模型

TCP/IP四层网络模型 TCP/IP四层网络模型OSI七层网络模型总结记忆描述 整理一下TCP/IP四层网络模型和OSI七层网络模型的知识点。 TCP/IP四层网络模型 TCP/IP模型是互联网的基础&#xff0c;它由以下四层组成&#xff1a; 应用层&#xff08;Application Layer&#xff09;&…

VIC模型率定验证

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…