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

相关文章

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.