
Unity使用GUI做屏幕自适应(完)
代码重复率的减少:通过抽象类实现代码的可复用性和可扩展性。 性能的优化:通过对绘制逻辑的优化和管理,提升应用的运行效率。 可维护性:清晰的层次结构使得后续的扩展和维护更加容易。
发布日期:2021-05-08 16:29:39
浏览次数:22
分类:精选文章
本文共 1933 字,大约阅读时间需要 6 分钟。
Unity UI控件优化之抽象类设计
一、控件基类设计
在Unity UI开发中,常见的GUI控件可能会有类似的显示逻辑和样式需求。为了避免重复代码并提高开发效率,我们可以设计一个通用的控件基类。
基类结构设计
创建一个抽象类CustomGUIControl
,其主要功能包括:
- 位置信息:通过
CustomGUIPos
脚本获取控件的绝对或相对位置信息。 - 显示内容:使用
GUIContent
来存储控件的显示文本、图片等。 - 自定义样式:提供一个
GUILayoutStyle
来允许用户自定义控件的外观样式。 - 样式开关:通过
E_Style_OnOff
枚举来控制控件是否启用自定义样式。
public enum E_Style_OnOff { On, Off }public abstract class CustomGUIControl : MonoBehaviour{ public CustomGUIPos guiPos; public GUIContent content; public GUIStyle style; public E_Style_OnOff style_OnOff = E_Style_OnOff.Off; protected virtual void StyleOnDraw() { } protected virtual void StyleOffDraw() { }}
样式切换逻辑
根据style_OnOff
的状态,决定使用默认样式或自定义样式:
public void DrawGUI(){ switch (style_OnOff) { case E_Style_OnOff.On: StyleOnDraw(); break; case E_Style_OnOff.Off: StyleOffDraw(); break; }}
二、优化思路
在实际项目中,可能会遇到多个控件需要统一绘制的问题。为了实现高效的UI更新,我们可以采用以下优化策略。
代码重用与管理
通过使用[ExecuteAlways]
属性,我们可以在编辑模式下实时预览UI状态。同时,使用GetComponentsInChildren<CustomGUIControl>()
来获取当前物体的所有子控件。
[ExecuteAlways]public class CustomGUIRoot : MonoBehaviour{ private CustomGUIControl[] allControls; private void Start() { allControls = GetComponentsInChildren(); } private void OnGUI() { if (!Application.isPlaying) { allControls = GetComponentsInChildren (); } foreach (var control in allControls) { control.DrawGUI(); } }}
绘制顺序管理
为了实现复杂UI场景的渲染顺序控制,可以根据需求设置控件的绘制优先级。通过在OnGUI()
方法中按优先级顺序绘制控件,可以确保UI渲染的正确性。
性能优化
在实际运行中,为了提升性能,可以采用以下优化方法:
- 减少开销:避免在
OnGUI()
中进行频繁的组件查找,可以将查找操作缓存到Start()
或OnEnable()
中。 - 绘制控制:对于不需要频繁更新的控件,可以选择在
OnGUI()
中只绘制特定控件,减少不必要的计算开销。
总结
通过设计一个通用的CustomGUIControl
基类,我们能够显著降低代码冗余率,同时实现对UI控件的统一管理和绘制顺序控制。这种方法不仅提高了开发效率,也为后续的模块开发奠定了良好的基础。
这种设计思路的核心在于:
这种方法在实际项目中得到了广泛应用,是解决复杂UI场景开发问题的有效策略。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年03月29日 05时04分07秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
2019-03-06
百度前端技术学院task16源代码
2019-03-06
解析js中( ( ) { } ( ) )的含义
2019-03-06
js设计模式总结5
2019-03-06
Python大神编程常用4大工具,你用过几个?
2019-03-06
一文带你了解图神经网络
2019-03-06
9个常用ES6特性归纳(一般用这些就够了)
2019-03-06
3D渲染集群,你了解多少?
2019-03-06
除了方文山,用TA你也能帮周杰伦写歌词了
2019-03-06
关于GO语言,这篇文章讲的很明白
2019-03-06
华为云FusionInsight湖仓一体解决方案的前世今生
2019-03-06
大数据处理黑科技:揭秘PB级数仓GaussDB(DWS) 并行计算技术
2019-03-06
C++调用Go方法的字符串传递问题及解决方案
2019-03-06
云原生2.0时代下,DevOps实践如何才能更加高效敏捷?
2019-03-06
技巧收藏|10个JavaScript常用数组操作方法
2019-03-06
两种端到端通用目标检测方法
2019-03-06
云小课 | 守护网络安全不是问题,iptables的四表五链为你开启“八卦阵”
2019-03-06
LiteOS内核源码分析:任务栈信息
2019-03-06
23种设计模式之迭代器模式
2019-03-06
23种设计模式之组合模式
2019-03-06