Unity获取RootCanvas大小Rect的问题

2024-03-30 16:08

本文主要是介绍Unity获取RootCanvas大小Rect的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天要做一个多设备适配方案,发现在修改了Canvas Scaler的Reference Resolution后不会立即生效,RectTransfrom的大小不变。

感觉要等到Update后才执行,个人不喜欢这种控制流程。

在网上搜了半天也没发现有人问这个,因为我的某些UI要通过Rect Size来计算大小,可能比较变态吧。所以做一个笔记记录一下。

网上找到一个函数

private void OnRectTransformDimensionsChange(){Debug.Log("x==========>x:"+GetComponent<RectTransform>().rect);}

加到UI Root节点脚本中,可以在大小发生变化的时候调用到。

经过测试。在实例化UI预设的时候就已经改变了好几次大小。

AssetBundle ab = ((DownloadHandlerAssetBundle)www.downloadHandler).assetBundle;GameObject uimainobj = (GameObject)UnityEngine.Object.Instantiate(ab.LoadAsset(ab.GetAllAssetNames()[0]));//这里输出了4 次uimainobj.name = "UIMain";Canvas c = uimainobj.GetComponent<Canvas>();c.worldCamera = uiCamera; //这里输出了1次

在这里插入图片描述
Object.Instantiate输出了前4次。
worldCamera 赋值也会调用1次。

看了CanvasScaler.cs源码后,应该是Hander()函数重新计算了大小。
发现OnEnable函数也会调用Hander()函数,所以,我们只要禁用脚本然后打开让他调用一次就好了。

Debug.Log("x========1");cScaler.enabled = false;//不同的分辨率比率,显示不用的画布大小w_h_rate = (float)Screen.width / Screen.height;isPad = w_h_rate > pad_rate ? true : false;if (isPad)cScaler.referenceResolution = new Vector2(padUIWidth, padUIHeight);elsecScaler.referenceResolution = new Vector2(defaultUIWidth, defaultUIHeight);cScaler.enabled = true;Debug.Log("x========2");

在这里插入图片描述
2133就是正常后的高度,看来可行。

附:CanvasScaler.cs 部分代码

protected override void OnEnable(){base.OnEnable();this.m_Canvas = this.GetComponent<Canvas>();this.Handle();}/// <summary>///   <para>See MonoBehaviour.OnDisable.</para>/// </summary>protected override void OnDisable(){this.SetScaleFactor(1f);this.SetReferencePixelsPerUnit(100f);base.OnDisable();}/// <summary>///   <para>Handles per-frame checking if the canvas scaling needs to be updated.</para>/// </summary>protected virtual void Update(){this.Handle();}/// <summary>///   <para>Method that handles calculations of canvas scaling.</para>/// </summary>protected virtual void Handle(){if ((UnityEngine.Object) this.m_Canvas == (UnityEngine.Object) null || !this.m_Canvas.isRootCanvas)return;if (this.m_Canvas.renderMode == RenderMode.WorldSpace){this.HandleWorldCanvas();}else{switch (this.m_UiScaleMode){case CanvasScaler.ScaleMode.ConstantPixelSize:this.HandleConstantPixelSize();break;case CanvasScaler.ScaleMode.ScaleWithScreenSize:this.HandleScaleWithScreenSize();break;case CanvasScaler.ScaleMode.ConstantPhysicalSize:this.HandleConstantPhysicalSize();break;}}}/// <summary>///   <para>Handles canvas scaling that scales with the screen size.</para>/// </summary>protected virtual void HandleScaleWithScreenSize(){Vector2 vector2 = new Vector2((float) Screen.width, (float) Screen.height);float scaleFactor = 0.0f;switch (this.m_ScreenMatchMode){case CanvasScaler.ScreenMatchMode.MatchWidthOrHeight:scaleFactor = Mathf.Pow(2f, Mathf.Lerp(Mathf.Log(vector2.x / this.m_ReferenceResolution.x, 2f), Mathf.Log(vector2.y / this.m_ReferenceResolution.y, 2f), this.m_MatchWidthOrHeight));break;case CanvasScaler.ScreenMatchMode.Expand:scaleFactor = Mathf.Min(vector2.x / this.m_ReferenceResolution.x, vector2.y / this.m_ReferenceResolution.y);break;case CanvasScaler.ScreenMatchMode.Shrink:scaleFactor = Mathf.Max(vector2.x / this.m_ReferenceResolution.x, vector2.y / this.m_ReferenceResolution.y);break;}this.SetScaleFactor(scaleFactor);this.SetReferencePixelsPerUnit(this.m_ReferencePixelsPerUnit);}
......

这篇关于Unity获取RootCanvas大小Rect的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/861944

相关文章

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

springboot的controller中如何获取applicatim.yml的配置值

《springboot的controller中如何获取applicatim.yml的配置值》本文介绍了在SpringBoot的Controller中获取application.yml配置值的四种方式,... 目录1. 使用@Value注解(最常用)application.yml 配置Controller 中

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

idea粘贴空格时显示NBSP的问题及解决方案

《idea粘贴空格时显示NBSP的问题及解决方案》在IDEA中粘贴代码时出现大量空格占位符NBSP,可以通过取消勾选AdvancedSettings中的相应选项来解决... 目录1、背景介绍2、解决办法3、处理完成总结1、背景介绍python在idehttp://www.chinasem.cna粘贴代码,出

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

java反序列化serialVersionUID不一致问题及解决

《java反序列化serialVersionUID不一致问题及解决》文章主要讨论了在Java中序列化和反序列化过程中遇到的问题,特别是当实体类的`serialVersionUID`发生变化或未设置时,... 目录前言一、序列化、反序列化二、解决方法总结前言serialVersionUID变化后,反序列化失