Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题

Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题

目录

Unity 问题 之 ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题

一、简单介绍

二、问题现象

三、问题分析

四、问题解决思路

五、案例解决实现步骤

六、案例关键代码


一、简单介绍

Unity 在开发中,记录一些报错问题,以便后期遇到同样问题处理。

有时我们在开发中,一起使用 ScrollView ,LayoutGroup,ContentSizeFitter,对于简单的排布,一般会很好的自动更新适配,但是有时候复杂了时候未必很好的自动的调整,进行很好适配。

ScrollView 在可滚动区域中显示内容。当你向ScrollView添加内容时,内容会被添加到ScrollView的内容容器(#unity-content-container)中。

Layout Group 翻译为“布局组”,从字面意思就可以理解,可以对一组元素进行动态布局,这里说的动态是,组内元素数量发生变化时,Layout Group可以智能的帮助你重新排版。

ContentSizeFitter 作为一个布局控制器,控制它自己的布局元素的大小。大小由游戏对象上的布局元素组件提供的最小或首选尺寸决定。这样的布局元素可以是图像或文本组件、布局组或布局元素组件。

值得注意的是,当一个矩形变换被缩放时——无论是通过 ContentSizeFitter 还是其他东西——缩放的范围是围绕基准值进行的。这意味着可以使用基准值来控制缩放的方向。

例如,当枢轴位于中心时,ContentSizeFitter 将在所有方向上均匀地扩展矩形变换。当枢轴位于左上角时,内容大小调整器会将矩形变换向下和向右展开。

二、问题现象

现象中,刚开始与生成布局显示是没有问题,当动态添加一些 Item 的时候,会出现 布局显示都不对,会有重叠,或者 Scroll 滑动布局显示不全的现象。

三、问题分析

案例中:

这里时使用 ScrollView  进行内容过多的时候,可以进行自动滑动浏览内容,其中使用到 LayoutGroup 进行排布,ContentSizeFitter 进行画布自动适配调整大小。

值得注意的是:我这里的嵌套的使用了 LayoutGroup ,和 ContentSizeFitter ,就是Item 中的子物件中还有自动排布和自动适配大小的 LayoutGroup ,和 ContentSizeFitter 组件使用。

由于嵌套,在动态生成中,子物体中也嵌套 LayoutGroup ,和 ContentSizeFitter ,父物体中的 LayoutGroup ,和 ContentSizeFitter 进行计算的时候,就会出现计算错误的现象,布局不对,且Scroll 滑动布局显示不全的现象。

四、问题解决思路

1、Canvas 强制刷新

Canvas.ForceUpdateCanvases();

2、对于unity的gridLayout verticalLayout 或者 horizontalLayout 经常有加入新成员或者改变成员大小后,部件大小、位置不对的问题,一般来说 ,这个方法就能解决

LayoutRebuilder.ForceRebuildLayoutImmediate(rectTransform);

3、用开关 gameobject 等一帧之类的方法解决,然后处理

horizLayoutGroup.CalculateLayoutInputHorizontal();
horizLayoutGroup.CalculateLayoutInputVertical();
horizLayoutGroup.SetLayoutHorizontal();
horizLayoutGroup.SetLayoutVertical();

4、还有就是进行 ContentSizeFitter 组件可以根据其子对象的大小来自动调整父对象的大小。但是,有时在动态添加内容后,ContentSizeFitter 可能无法立即更新,可以进下面

// 手动强制更新 ContentSizeFitter
ContentSizeFitter contentSizeFitter = yourContent.GetComponent<ContentSizeFitter>();
if (contentSizeFitter != null)
{contentSizeFitter.SetLayoutHorizontal();contentSizeFitter.SetLayoutVertical();
}

5、延迟更新: 如果进行一次更新无法达到刷新的效果,在向ScrollRect添加内容后,有时需要在下一帧中更新滚动视图和滚动条的范围。这可以通过将更新放置在 LateUpdate 中实现。

  • 如果这里比较耗性能,
  • 可以试着在有数据UI变化的时候触发更新若干时间关闭更新
  • 根据需要合理调整即可
void LateUpdate()
{// 在 LateUpdate 中更新内容和滚动条范围// 更新 Content 大小// 更新滚动条范围
}

五、案例解决实现步骤

1、创建 Unity 工程,进行 UI 布局如下,主要是 Scroll View ,然后再 Content 添加 LayoutGroup ,和 ContentSizeFitter 组件

2、要进行实例化的预制体说明,ImageGroup,和 ImageItem

3、新建脚本,进行ScrollView 的Content 动态生成,开始预生成部分,然后按下空格键 Space ,进行随机生成

4、把 Test 挂载到场景中,赋值父物体,和对应预制体

5、运行,按下空格键Space 随机生成 Item 有时候就会出现不能及时适配更新的情况

6、进行对应的处理后,这里是在 LateUpdate 进行更新

  • 如果这里比较耗性能,
  • 可以试着在有数据UI变化的时候触发更新若干时间关闭更新
  • 根据需要合理调整即可

7、运行场景,不能及时更新布局问题基本解决

六、案例关键代码


using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;/// <summary>
/// ScrollView ,LayoutGroup,ContentSizeFitter 一起使用时,动态变化时无法及时刷新更新适配界面的问题
/// </summary>
public class Test : MonoBehaviour
{#region Data/// <summary>/// ImageGroup 预制体/// </summary>public GameObject ImageGroup;/// <summary>/// ImageItem 预制体/// </summary>public GameObject ImageItem;/// <summary>/// ParentTran 父物体 ImageGroup/// </summary>public Transform ParentTran;/// <summary>/// ImageGroup 列表/// </summary>List<GameObject> m_ImageGroupGoLst;#endregion#region Lifecycle function/// <summary>/// Start is called before the first frame update/// </summary>void Start(){Init();}/// <summary>/// Update is called once per frame/// </summary>void Update(){if (Input.GetKeyDown(KeyCode.Space)) {GameObject go = GetRandomImageGroup();CreateImageItemGameObject(go.transform);}}/// <summary>/// LateUpdate is called once per frame/// </summary>private void LateUpdate(){// 如果这里比较耗性能,// 可以试着在有数据UI变化的时候触发更新若干时间关闭更新// 根据需要合理调整即可RefreshUICanvas();}#endregion#region Private Function/// <summary>/// 初始化生成部分队列/// </summary>void Init() {m_ImageGroupGoLst = new List<GameObject>();for (int i = 0; i < 2; i++){GameObject go = CreateImageGroupGameObject();if (i == 1) {for (int ii = 0; ii < 4; ii++){CreateImageItemGameObject(go.transform);}}m_ImageGroupGoLst.Add(go);}}/// <summary>/// 生成 ImageGroup 实体/// </summary>/// <returns></returns>GameObject CreateImageGroupGameObject() {return GameObject.Instantiate(ImageGroup, ParentTran,false);}/// <summary>/// 生成 ImageItem 实体/// </summary>/// <returns></returns>GameObject CreateImageItemGameObject(Transform parent){return GameObject.Instantiate(ImageItem, parent, false);}/// <summary>/// 随机获取 生成的 ImageGroup 实体/// </summary>/// <returns></returns>GameObject GetRandomImageGroup() {int index = Random.Range(0, m_ImageGroupGoLst.Count);GameObject go = m_ImageGroupGoLst[index];return go;}/// <summary>/// 刷新 UI  界面/// </summary>void RefreshUICanvas(){// 强制刷新Canvas.ForceUpdateCanvases();// Layout 重建LayoutRebuilder.ForceRebuildLayoutImmediate(ParentTran.GetComponent<RectTransform>());// contentSizeFitter 设置ContentSizeFitter contentSizeFitter = ParentTran.GetComponent<ContentSizeFitter>();if (contentSizeFitter != null){contentSizeFitter.SetLayoutHorizontal();contentSizeFitter.SetLayoutVertical();}}#endregion
}

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

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

相关文章

代码图形注释自动生成(通过文字图像)

0. 简介 大家在学&#xff08;CTRL&#xff09;习&#xff08;C&#xff09;别人代码的时候&#xff0c;看到别人的代码程序&#xff0c;在日志中有很多很酷的代码注释&#xff0c;或者是有一些图形化注释方便理解。之前本人以为都是一个个手敲出来的。然后在网上一番搜索&…

Unity头发飘动效果

Unity头发飘动 介绍动作做头发飘动头发骨骼绑定模拟物理组件 UnityChan插件下载UnityChan具体用法确定人物是否绑定好骨骼节点&#xff08;要做的部位比如头发等&#xff09;给人物添加SpringManager骨骼管理器给骨骼节点添加SpringBone这里给每个头发骨骼都添加上SpringBone。…

【Python必做100题】之第二十五题(统计字符)

题目&#xff1a;输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其他字符的个数 代码如下&#xff1a; string input("请输入字符串:")char 0 number 0 space 0 other 0for i in string:if i.isalpha():char 1elif i.isdigit():number 1eli…

springboot集成springdoc-openapi(模拟前端请求)

目录 描述---痛点 Springfox对比springdoc-openapi 1. 成熟度和维护性&#xff1a; 2. 依赖和配置&#xff1a; 3. 注解和使用方式&#xff1a; 4. 特性和扩展性&#xff1a; 应用目录结构 pom文件 新增测试controller StaffController YUserController 启动测试看下…

亚马逊品牌分析ABA功能有哪些?亚马逊选品的量化标准有哪些?——站斧浏览器

亚马逊品牌分析ABA功能有哪些&#xff1f; 1、品牌市场份额&#xff08;Share of Voice&#xff09; ABA提供了品牌在特定类别中市场份额的详细数据。这一模块帮助品牌所有者准确评估其品牌在整个市场中的竞争地位和表现。通过了解市场份额&#xff0c;品牌方可以制定更具针对…

Guava的TypeToken在泛型编程中的应用

第1章&#xff1a;引言 在Java世界里&#xff0c;泛型是个相当棒的概念&#xff0c;能让代码更加灵活和类型安全。但是&#xff0c;泛型也带来了一些挑战&#xff0c;特别是当涉及到类型擦除时。这就是TypeToken大显身手的时候&#xff01; 作为Java程序员的咱们&#xff0c;…

Epson爱普生手臂机器人与PC通讯 C#

一、Epson手臂配置 1.安装Epson手臂控制软件 安装Epson手臂控制软体EPSON RC+ 7.0(根据实际需求下载应用),可以去官网下载安装。 2.硬件配置 准备一台PC,用网线连接PC和EPSON手臂控制器。 3.在PC上修改IP地址 EPSON手臂默认IP(192.168.0.1),PC IP改为手臂同一网段…

MFC使用高速绘图控件high-speed Charting Control绘制柱形图

1. 创建MFC单文档工程BarChartDemo。 2. 在工程文件夹下新建文件夹ChartCtrl,将ChartCtrl源码放入,如下图所示。在工程中添加这些项,项目——添加——现有项,全部添加。 3. 添加一个对话框,ID为IDD_DLG_BAR,类名为CBarDlg。 4. 在对话框中添加Custom Control控件,将控…

业务框架概念及极简史

概念 ● 我们通过在“什么是业务”章节对业务的概念有个较为明确的认知&#xff0c;业务就是企业的经营活动。架构&#xff0c;也是等同于企业架构中的架构概念&#xff0c;架构就是 输出某种价值的主题&#xff0c;里面的配置&#xff1a;各种元素&#xff0c;元素之间的关系…

一个简单的获取显示器长宽和显示器分辨的代码

最近在做大屏显示&#xff0c;在现显示的时候有些显示器是不规则的&#xff0c;投到大屏上显示效果不好&#xff0c;可以直接获取显示器的分辨率&#xff0c;本地调整好&#xff0c;再直接部署。 <!DOCTYPE html> <html lang"en"> <head><meta …

LT8711UX,LT8711UXC ,LT8711UXD ,LT8711UXE1,LT8711UXE2的区别,选型的工程师注意了!!!

LT8711UX,LT8711UXC ,LT8711UXD ,LT8711UXE1,LT8711UXE2做为龙迅的重点物料&#xff0c;大家都不陌生。 可是它们不一样的后缀&#xff0c;又有什么不一样的应用区别呢&#xff1f; LT8711***均为DP/Type-C to HDMI系列的芯片。 LT8711UX&#xff0c;是一款带音频的Type-C…

Midjourney V6版本的5大新特性,掌握了,想法和实现信手拈来

Midjourney v6已推出&#xff1a;更简单的提示、增强的文本集成和更高水平的照片真实感&#xff01;以下是每个创意人员都需要了解的 5 个重要见解。 一、产品文字整合 使用简单风格提示向您的产品添加文本提示&#xff1a;带有文字“SALMA”的白色健身瓶 Midjourney v5.2&am…