【Unity】LayoutGroup自动缩放子对象大小

需求:
如果LayoutGroup的子物体太多,超出layoutGroup的范围,则对子物体进行缩小。确保子物体都在LayoutGroup的范围内

代码:


[ExecuteInEditMode]
[RequireComponent(typeof(HorizontalOrVerticalLayoutGroup))]
public class LayoutGroupChildFitter : MonoBehaviour, ILayoutController
{[Header("最小缩放尺寸,小于0的话脚本失效")]public float m_minChildSize = -1f;[Header("是否为水平布局")]public bool m_isHorizontal = true;//layoutGroup[SerializeField] HorizontalOrVerticalLayoutGroup m_layout = null;[SerializeField] RectTransform m_rectTransform;float m_curScale = 0;//子节点List<RectTransform> m_rectChildren = new List<RectTransform>();private void Start(){if (m_layout == null)m_layout = this.transform.GetComponent<HorizontalOrVerticalLayoutGroup>();if (m_rectTransform == null) m_rectTransform = this.GetComponent<RectTransform>();DoFixChildSize();}void ILayoutController.SetLayoutHorizontal(){if (m_layout == null)m_layout = this.transform.GetComponent<HorizontalOrVerticalLayoutGroup>();if (m_rectTransform == null)m_rectTransform = this.GetComponent<RectTransform>();DoFixChildSize();}void ILayoutController.SetLayoutVertical(){if (m_layout == null)m_layout = this.transform.GetComponent<HorizontalOrVerticalLayoutGroup>();if (m_rectTransform == null)m_rectTransform = this.GetComponent<RectTransform>();DoFixChildSize();}/// <summary>/// 子节点缩放/// </summary>void DoFixChildSize(){if (m_minChildSize < 0) return;GetRectChildren();float childrenSize = GetChildrenTotalSize();float contentSize = GetContentSize();float scale = contentSize / childrenSize;scale = Mathf.Clamp(scale, m_minChildSize, 1);if (m_curScale != scale){Debug.Log($"Layout Child 缩放{contentSize}/{childrenSize}=scale:{scale}");Vector3 localScale = Vector3.one * scale;SetChildrenChild(localScale);m_curScale = scale;LayoutRebuilder.ForceRebuildLayoutImmediate(m_rectTransform);}}/// <summary>/// 把所有子节点设置/// </summary>/// <param name="localScale"></param>void SetChildrenChild(Vector3 localScale){for (int i = 0; i < m_rectChildren.Count; i++){m_rectChildren[i].localScale = localScale;}}/// <summary>/// 计算容器尺寸/// </summary>/// <returns></returns>float GetContentSize(){float size = (m_isHorizontal) ? m_rectTransform.rect.width : m_rectTransform.rect.height;//边距float padding = (m_isHorizontal) ?m_layout.padding.right + m_layout.padding.left :m_layout.padding.top + m_layout.padding.bottom;//总间距float spacing = (m_rectChildren.Count - 1) * m_layout.spacing;return size - padding - spacing;}/// <summary>/// 计算子物体总尺寸/// </summary>/// <returns></returns>float GetChildrenTotalSize(){//总长度float total = 0;for (int i = 0; i < m_rectChildren.Count; i++){if (!m_rectChildren[i].gameObject.activeInHierarchy) continue;  //不考虑隐藏if (m_isHorizontal) total += m_rectChildren[i].sizeDelta.x;else total += m_rectChildren[i].sizeDelta.y;}return total;}/// <summary>/// 获取子物体/// </summary>void GetRectChildren(){if (transform.childCount == m_rectChildren.Count) return;m_rectChildren.Clear();for (int i = 0; i < transform.childCount; i++){RectTransform rect = transform.GetChild(i).GetComponent<RectTransform>();if (!m_rectChildren.Contains(rect)) m_rectChildren.Add(rect);}}
}

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

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

相关文章

【Java 进阶篇】JQuery DOM操作:通用属性操作的绝妙魔法

在前端的舞台上&#xff0c;JQuery犹如一位魔法师&#xff0c;为我们展现了操纵HTML元素的奇妙技巧。而在这个技巧的精妙组成中&#xff0c;通用属性操作是一门绝妙的魔法。在本篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的通用属性操作&#xff0c;揭示这段魔法的神…

11.13 牛客刷题8/10

11.13 信号完整性 指针地址 的加减&#xff0c;注意 最后转为16进制

前端食堂技术周刊第 104 期:Angular v17、GPTs、Vue vapor mode、Svelte Flow、Bundler 的设计取舍

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;金奖乳鸽 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

leetCode 25.K 个一组翻转链表

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。k 是一个正整数&#xff0c;它的值小于 或 等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值&a…

【PIE-Engine 数据资源】全球250米LAI产品

文章目录 一、 简介二、描述三、波段四、示例代码参考资料 一、 简介 数据名称全球250米LAI产品时间范围2015年空间范围全球数据来源北京师范大学肖志强教授团队代码片段var images pie.ImageCollection(“BNU/LAI/GLOBAL-250”) 二、描述 全球 250 米叶面指数产品由北京师范…

本地PHP搭建简单Imagewheel私人云图床,在外远程访问——“cpolar内网穿透”

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

产品化的GPT,能否为“百模大战”照亮未来?

这两天&#xff0c;AI圈都处在一种莫名的震撼感当中。 北京时间 11月7日&#xff0c;OpenAI 举办了首次DevDay开发者日活动。活动现场发布了非常多内容&#xff0c;其中有一些按部就班的&#xff0c;比如技术上更新了最新版本的GPT-4 Turbo。也有一些让从业者目瞪口呆&#xff…

大数据之LibrA数据库系统告警处理(ALM-12035 恢复任务失败后数据状态未知)

告警解释 执行恢复任务失败后&#xff0c;系统会自动回滚&#xff0c;如果回滚失败&#xff0c;可能会导致数据丢失等问题&#xff0c;如果该情况出现&#xff0c;则上报告警&#xff0c;如果下一次该任务恢复成功&#xff0c;则恢复告警。 告警属性 告警ID 告警级别 可自动…

Excel表列名称

题意&#xff1a; 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1&#xff1a; 输入&#xff1a; columnNumber 1 输出&#xff1a; “A”…

高速高精运动控制,富唯智能AI边缘控制器助力自动化行业变革

随着工业大数据时代的到来&#xff0c;传统控制与决策方式无法满足现代数字化工厂对工业大数据分析与决策的需求&#xff0c;AI边缘控制器赋能现代化智慧工厂&#xff0c;实现工业智造与行业变革。 富唯智能AI边缘控制器&#xff0c;基于x86架构的IPC形态产品&#xff0c;通过…

如何进行前后端交互

引言 在 Web 开发中&#xff0c;前端与后端的交互是至关重要的。前端负责页面展示和用户交互&#xff0c;后端处理业务逻辑和数据存储。为了实现前后端的交互&#xff0c;我们需要使用合适的方式来进行数据传输和通信。本文将介绍如何进行前后端交互&#xff0c;并提供代码示例…

python爬虫hook定位技巧、反调试技巧、常用辅助工具

一、浏览器调试面板介绍 二、hook定位、反调试 Hook 是一种钩子技术&#xff0c;在系统没有调用函数之前&#xff0c;钩子程序就先得到控制权&#xff0c;这时钩子函数既可以加工处理&#xff08;改变&#xff09;该函数的执行行为&#xff0c;也可以强制结束消息的传递。简单…

视觉大模型DINOv2:自我监督学习的新领域

1 DINOv2 1.1 DINOv2特点 前段时间&#xff0c;Meta AI 高调发布了 Segment Anything&#xff08;SAM&#xff09;&#xff0c;SAM 以交互式方式快速生成 Mask&#xff0c;并可以对从未训练过的图片进行精准分割&#xff0c;可以根据文字提示或使用者点击进而圈出图像中的特定…

AISchedule(3):基础生成表格

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>事件列表</title><!-- 加载样式表 --><style>/* 基础样式 */body {background: linear-gradient(to bottom, #f2f2f2, #e0e0e0);font-family: Helvetica…

C++ 字符串学习资料

C 字符串学习资料 目录 什么是字符串&#xff1f;字符串的声明和初始化字符串的常见操作字符串的输入和输出字符串的比较和连接字符串的搜索和替换字符串的转换和子串提取 什么是字符串&#xff1f; 在 C 中&#xff0c;字符串是由字符组成的序列&#xff0c;用于表示文本数…

【Git】第四篇:基本操作(理解工作区、暂存区、版本库)

Git 工作区、暂存区和版本库 工作区&#xff1a;就是我们创建的本地仓库所在的目录暂存区&#xff1a; stage或index&#xff0c;一般放在.git(可隐藏文件)目录下的index文件&#xff08;.git/index&#xff09;中&#xff0c;所以我们把暂存区有时候也叫做索引&#xff08;in…

JVM:如果是你,你如何解决跨代引用的问题?(记忆集和卡集)

这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫&#xff0c;如果对这部分内容感到枯燥或者疑惑&#xff0c;可以先放下看&#xff0c;等后续遇到要使用它们的实际场景、实际问题时再结合问题&#xff0c;再回来阅读和理解。 记忆集和卡集 前面在分代收集理论那…

Android 13.0 修改wifi信号强度

1.前言 在13.0的系统rom产品定制化开发中,在进行产品开发中,对应系统定制会有各种各样的需求,对纯wifi产品而言,对于wifi要求也是越来越高,因此有客户要求对wifi信号强度做定制,修改信号强度来增强显示wifi信号,所以要对wifi显示信号强度的相关代码做修改 2.修改wifi信…

【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法

在前端的舞台上&#xff0c;属性操作是我们与HTML元素进行互动的关键步骤之一。而JQuery&#xff0c;这位前端开发的巫师&#xff0c;通过简洁而强大的语法&#xff0c;为我们提供了便捷的属性操作工具。在这篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的属性操作&…

FPGA与STM32_FSMC总线通信实验

FPGA与STM32_FSMC总线通信实验 内部存储器IP核的参数设置创建IP核FPGA代码STM32标准库的程序 STM32F407 上自带 FSMC 控制器&#xff0c;通过 FSMC 总线的地址复用模式实现STM32 与 FPGA 之间的通信&#xff0c;FPGA 内部建立 RAM 块&#xff0c;FPGA 桥接 STM32 和 RAM 块&…