ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YIUI框架解析:基于ET的数据驱动UI,让Unity界面开发效率飞升

YIUI框架解析:基于ET的数据驱动UI,让Unity界面开发效率飞升 1. 从ET到YIUI我为什么最终选择了这套数据驱动方案聊YIUI之前得先说说我自己的背景。从UGUI时代写UI到现在前前后后经历过三四个项目的UI框架从零搭建也踩过直接用原生UGUI写大型项目的坑。如果你也做过那种UI层级乱成一锅粥、改个数值要找半天回调、策划提个需求要动三四个脚本的活那你看到YIUI框架的第一眼大概率会跟我一样——有点相见恨晚的意思。YIUI是运行在ET框架之上的一套UI解决方案核心思路就是数据驱动。简单说你把UI当作数据的“投影”数据一变界面自动跟着变不需要你手动去SetText、SetActive、SetSprite这一堆东西。我第一次用的时候心里也在打鼓自动更新听起来美好但真的扛得住复杂业务吗会不会变成“黑魔法”出了问题都不知道去哪儿查带着这些疑问我搭了好几个Demo又在一个中大型项目里完整用了一轮这才算把它的脾气摸清楚。这个内容适合谁看如果你已经在用ET框架开发或者你正在纠结Unity项目里到底该用什么UI框架再或者你写UI写腻了、想体验一下数据驱动的思路到底能把开发效率提到什么程度这篇文章都值得你花几分钟看完。我会把YIUI的设计思路、核心机制、实际操作步骤以及我真实遇到过的坑一次性讲透。2. YIUI整体设计思路拆解数据驱动到底在解决什么问题2.1 传统UI开发的痛点为什么改个显示逻辑会这么累先聊聊我们最熟悉的UGUI写法。假设你要做一个背包界面里面有道具图标、数量文本、选中高亮、按钮可交互状态。传统做法是什么先给各个组件起好名字然后在代码里GetComponent拿到引用写一个RefreshUI方法在方法里根据数据把各个组件一个个赋值填好再在数据变化的地方手动调用RefreshUI。这看起来没什么问题但项目一旦大起来麻烦就来了。首先是“改一处漏一处”的问题数据可能在好几个地方被修改你得保证每个修改点都调了RefreshUI。漏了界面就不刷新你得顺着调用链一路去查查到了还得骂自己当初怎么又忘了。其次是UI状态和数据强耦合你为了知道某个按钮该不该显示你得在RefreshUI里写一堆ifif (item.Count 0) showButton.gameObject.SetActive(true)这种业务多了以后整个Refresh方法能写到两三百行谁接手谁崩溃。最后是复用困难两个界面显示同一份数据你得各自写一套刷新逻辑数据同步稍有闪失两个界面就显示不一致。我在项目里见过最崩溃的一个场景为了做一个红点提示策划要求背包里的道具在数量变化后如果满足某个条件界面上要亮红点。这个红点的触发逻辑被写进了道具的SetCount方法里、背包界面的RefreshUI里、还有某个弹窗的OnEnable里——一共三处。后来需求改成“达到上限不再亮红点”改了三处还漏了一处测试提了Bug回来几个人排查了半天才明白原来是同一个UI状态被分散管理了。2.2 YIUI数据驱动方案的核心思路状态即界面界面即状态YIUI换了一个思路来解这个问题界面显示什么完全由数据状态决定。你在UI脚本里不写“把某个文本设置成xxx”而是写“这个文本显示的是xxx这个数据字段”。数据一变框架自动找到所有显示了该字段的UI组件把它们全部刷新一遍。这个思路说白了就是一句话把数据当作唯一的事实来源UI只是数据的投影。你不再需要关心“什么时候去刷新界面”只需要关心“数据什么时候被改变”。界面刷新这件事从“人肉触发”变成了“自动响应”。从业务开发者的角度最直观的体感变化是UI脚本里大量的GetComponent和SetText不见了取而代之的是声明式的绑定关系。比如有一个道具数量文本你只需要声明“这个文本绑定到ItemData.Count字段”剩下的事框架帮你搞定。道具数量在逻辑层随便改改完界面自动就变了。不存在“忘了调刷新”这回事因为根本没有需要手动调的刷新。这里需要多说一句数据驱动并不等于“放弃对UI的控制”。恰恰相反它把控制权的重心转移到了数据层。你需要更多地去思考“数据模型该怎么设计”而不是“UI组件该怎么操作”。关于这个后面在第3章的实操环节里我会用一个具体的例子展开。2.3 为什么和ET框架绑定YIUI选择的天时与地利YIUI不是一套独立运行的UI框架它从底层就依赖ET框架提供的一些基础设施。ET框架Entity Technology在国产Unity开发圈里有不少用户它把ECS思想、协程异步、热更新等概念揉在一起解决了传统MonoBehaviour项目在大型多人在线游戏里遇到的不少工程问题。YIUI选择基于ET首先获得的是异步驱动能力。ET有一套自己的异步系统用协程来处理逻辑、加载资源都非常顺手。YIUI的窗口加载、界面打开、数据绑定刷新这套流程天然可以跟ET的异步体系融合在一起写起来不会出现“UI加载是同步的但逻辑是异步的”这种割裂感。其次是实体的思维模式。ET框架强调一切皆实体YIUI把UI窗口、UI组件、数据绑定关系都以实体形式进行管理。得益于实体生命周期框架可以非常方便地管理界面什么时候创建、什么时候激活、什么时候销毁绑定关系也能跟着实体的生命周期自动清理省去了我这种粗心程序员最容易犯的“事件忘注销”问题。换个角度说如果你是第一次接触ET直接上手YIUI可能会有一点门槛——你得先了解ET的实体、协程、事件分发这些基础概念。但反过来如果你已经在用ET那YIUI几乎是和ET体系融合得最自然的一套UI方案没有之一。3. YIUI核心机制详解与实操要点数据绑定、组件体系与生命周期3.1 数据绑定是怎么工作的从数据到UI的自动更新链路YIUI数据驱动的基石是数据绑定。它的工作机制可以分为三步走定义数据字段、绑定UI组件、监听数据变更。第一步定义数据字段。以背包道具为例道具的核心显示数据至少包括道具ID、图标路径、当前数量、是否选中、是否满级。在YIUI里这些字段会被组织到一个数据模型类中。第二步绑定UI组件把界面上的文本、图标、选中高亮对象等组件和数据模型的字段一一对应起来。绑定完成后第三步就交给框架了——当某个字段的值发生变化框架会自动通知所有绑定了这个字段的UI组件刷新自己。这里最关键的一个问题是框架怎么知道字段变了最简单的实现方式是属性监听也就是给字段加上setter在setter里触发变更通知。YIUI也是这么干的但它不是让你写一堆重复的属性定义而是提供了一套可以简化这个过程的写法。我写一个简化的示例来说明这个链路具体API以你使用的YIUI版本为准代码大致长这样public class ItemData { private int _count; public int Count { get _count; set { if (_count ! value) { _count value; // 通知所有绑定了Count字段的UI刷新 } } } }这里有一个我在前期使用中没太注意、后来才体会到的设计细节值不变不通知。赋值的时候先判断新旧值是否相同相同就不触发刷新。这个细节太重要了。如果每次setter都无脑触发通知有时候一个列表刷新一下把几十个字段全部set一遍会引发大量无意义的UI刷新直接卡顿。需要注意实际工程里你不会手工去把每个字段都写成属性那太啰嗦了。YIUI提供了更简洁的封装方式让你只写“我曾经差点被这个东西吓到过——一度以为它在用反射后来翻了源码才发现人家用的是编译时辅助生成不是运行时反射性能没有想象中那么贵大家不用一听见动态绑定就担心性能崩盘。3.2 组件绑定与UI复用机制UI层不再是一片混沌YIUI里UI不是一颗一颗散落的组件自己连来连去而是以“窗口-组件”的结构组织。一个UI界面是一个窗口窗口内部由一个个功能组件拼装而成每个功能组件拥有自己独立的绑定数据和一个独立的“视图模型”类。举个例子一个背包界面是一个窗口底下挂了“道具格子列表”“角色金币文本”“整理按钮”等功能组件。道具格子列表这个组件绑定的数据是“道具数据列表”每个格子显示的数据是列表中的一项。如果我在逻辑层往这个列表里加了一个新道具列表组件会自动刷新多渲染出一个格子来删掉一个道具它也自动消失。这种“组件-数据”一一对应的模型最大的价值是UI复用。一个道具格子组件在背包界面能用在商店界面能用在装备详情弹窗里也能用。不管在哪个界面只要往组件里塞一份道具数据它就能显示出来。你不需要为每个界面各写一套道具显示逻辑只需要定义好一个“道具格子组件”和对应的数据模型然后到处复用就行。实际项目里这带来的可维护性提升是肉眼可见的。我接手过一个老项目背包界面、商店界面、奖励预览界面各有一套道具显示的代码三套长得差不多但细节各有微妙差异。策划提了个“道具加个品质动态光效”的需求我要改三套代码等于一份工作干三遍。用YIUI的方式改一个组件就够了三个界面全部同步生效。3.3 窗口生命周期打开、关闭、复用框架帮你管得好好的如果你写过纯手写UGUI的界面管理你一定写过这种代码用Dictionary存窗口实例、打开前检查是否已存在、关闭时决定是销毁还是隐藏、界面之间还要处理层级关系、遮罩、返回逻辑。这些代码不难写但写的量很大而且每个项目几乎都在重写一遍。YIUI把窗口生命周期做成了一套标准流程。打开窗口有标准的打开接口关闭窗口有标准的关闭接口。打开时窗口可以设置参数比如打开商店窗口时可以传一个“商店ID”关闭时支持返回值比如关闭一个二次确认弹窗时可以把“玩家点了确定还是取消”的结果带回去。还有窗口缓存机制经常会反复打开的窗口比如角色面板、商城可以设置成关闭时不销毁只是隐藏下次打开直接显示省去重复加载。生命周期这块我最喜欢的是弹出返回栈。手游里满屏的弹窗从设置弹窗里点开客服弹窗客服弹窗里点开礼包弹窗然后一层一层往后退。手写返回栈很容易写着写着就乱了YIUI直接给你现成的一套弹窗入栈、关闭出栈、安卓返回键默认走栈内返回逻辑。这个功能看着不起眼没有的时候才知道多难受。3.4 与UGUI、FairyGUI的方案对比YIUI到底赢在哪聊一个大家肯定会纠结的问题我到底该用UGUI、FairyGUI还是YIUIUGUI是Unity自带的UI系统跟编辑器集成得最好生态最成熟但是它的UI代码要完全自己组织。管理器、状态同步、层级、绑定逻辑每个项目都得从零开始造轮子。Unity官方后来也出了UI Toolkit但游戏运行时UI目前还是UGUI用得最广YIUI的底层用的其实还是UGUI的渲染和交互体系等于在UGUI上面给你盖了一层数据驱动的地基。FairyGUI是一套老牌的商业化UI方案在UI编辑器和制作流程上做得非常成熟美术和策划上手成本低动画和图文混排能力强。但FairyGUI的代码逻辑同样是主动刷新式——你改了数据以后需要手动调用刷新接口。而且FairyGUI的运行时和数据层是完全独立的不会主动跟你的游戏逻辑数据模型绑定。YIUI的价值区间正好夹在两者之间它保留了UGUI那套“所见即所得”的编辑器工作流又引入了数据驱动带来的自动同步能力。如果你受够了FairyGUI里还得手动调刷新又不想像UGUI那样纯手工维护一堆管理脚本YIUI是值得一试的中间选项。当然YIUI也有它的学习成本和性能开销。自动绑定和自动刷新必然带来额外的运行时开销虽然框架已经尽力做得很快了但如果你是一个极其在乎UI极致性能、所有界面都要走对象池手写优化的性能狂魔那YIUI的封装可能让你觉得不够“裸”。但从我实际项目来看这套开销换来的开发效率和出Bug率的降低是绝对值回票价的。4. 实操实录从0到1搭建一个数据驱动UI界面4.1 环境准备ET框架和YIUI的安装步骤动手之前先把环境搭好。YIUI是基于ET框架运行的所以你得先有一个能跑的ET框架工程。我用的版本是ET 6.0之后的版本YIUI官方仓库对不同的ET版本有对应的分支这个务必要先看清楚了。我之前有个同事没看分支说明直接拉了一个最新的YIUI往一个ET 5.0的老工程里塞结果编译报错报了一下午白白浪费时间。大致的安装流程是准备好ET框架工程确保能正常编译运行。从YIUI仓库拉取对应ET版本的YIUI代码放入工程的适当目录中。在工程配置里加上YIUI需要的宏定义具体宏名以YIUI文档为准。把YIUI的启动组件挂到启动流程里登录场景后能看到YIUI的初始化Log输出就说明基础环境通了。这里我要强调一句用YIUI之前请先把ET框架的基础概念过一遍。至少你得知道实体Entity怎么创建、怎么挂组件、事件系统怎么发消息、协程怎么用。不然你会陷入一种熟悉的痛苦——官方示例能跑起来自己一写就懵。不是YIUI的问题是ET的基本功没到位。4.2 定义数据模型先想清楚“界面需要显示哪些数据”我习惯在写UI之前先花时间设计数据模型。这是数据驱动开发模式和传统模式最大的思维差异传统模式你会想“界面上这个文本要设成什么”数据驱动模式你会想“这个界面关注的数据字段是哪些类型是什么变化频率高不高”。拿一个简单的“角色信息面板”来举例。界面需要显示角色名、等级、当前经验、经验上限、金币、钻石。那数据模型就可以设计成这样public class RolePanelData { public string RoleName { get; set; } public int Level { get; set; } public long CurrentExp { get; set; } public long MaxExp { get; set; } public long Gold { get; set; } public long Diamond { get; set; } }我特意都没写属性通知逻辑因为实际用YIUI时数据模型的基类和字段写法都有更简洁的封装这里就先不纠结API细节了。重点是这个类只包含“界面要显示什么”不包含“界面怎么显示”。UI怎么排版、文本颜色怎么变化、经验条是多宽——这些都不应该出现在数据模型里。在小项目里你会觉得这个设计多此一举但一旦项目大起来数据层和UI层分离带来的收益会越来越明显。你可以在完全不动UI的情况下改数据结构也可以在完全不动数据的情况下重做整个UI界面。两边的改动互不干扰这就是分层的好处。4.3 创建界面预制体绑定组件时的几个关键点工程上的流程是先在场景里搭建界面的视觉效果。如果你熟悉UGUI这个环节没有任何区别——都是创建Canvas摆放Image、Text、Button等组件。区别在接下来的绑定环节。YIUI里你需要为界面创建一个UI实体这个实体负责持有界面数据模型和界面组件之间的绑定关系。在Unity编辑器里YIUI会提供一些辅助工具让你可以为UI组件指定绑定的数据字段名比如把某个Text绑定到RolePanelData.RoleName把某个Image绑定到RoleIconPath这是我在示例数据模型里没写的一个字段你可以理解成角色头像的资源路径。我实操下来有几个心得绑定的时候字段名一定要起得表意清晰。因为绑定关系是字符串式的数据模型字段名和编辑器里设置的绑定名要对应如果字段叫A1、B2这种过两个月回来改需求你自己都看不懂这界面绑的是啥。命名清晰是一种隐形的生产力。图片绑定的处理和数据不一样。角色头像这种动态图片绑定的数据字段一般是一个资源路径或者图集ID。YIUI拿到这个字段值以后会去加载对应的图片资源并设置到Image组件上。这里有个加载时机的问题首次绑定到图片字段时有时资源还没加载完所以要做好异步加载和默认图显示的处理。这个基础体验问题如果没处理好玩家会在界面上经常看到“先出默认图再过零点几秒才切到真图”的闪烁感。多语言文本要注意。如果你游戏有本地化需求文本绑定字段往往绑定的是语言表里的Key而不是最终显示的文字。在数据驱动模式下这事儿特别自然因为你根本不关心文本显示的原文是什么只关心界面“显示的语言Key是哪个”。切换语言时框架把语言表一换所有界面绑定自动刷新成新语言的文本根本不需要为哪个界面单独写刷新。4.4 实现逻辑控制层怎么调数据UI怎么自动跟着变数据模型和界面绑定都准备好了剩下的就是业务逻辑写起来到底爽不爽的问题。假设我们要实现一个功能击杀一个怪物后角色经验增加100如果经验满了就升级。传统UGUI写法大概是在某个网络消息回调或者战斗逻辑里把角色经验字段改了然后找到角色面板调用它的RefreshUI方法让它重新读一遍角色数据并刷新显示。问题在于如果不止一个界面显示经验值——角色面板、头像栏、战斗结算界面——你得挨个调用它们的刷新方法少调一个就漏更一个。YIUI数据驱动的写法就不一样了。你只管把RolePanelData对应的字段Set成新值比如给经验字段赋值增加100后的数字剩下的事情框架帮你干所有绑定过这个字段的UI组件会自己刷新。如果有三个界面显示经验值三个都会自动更新以后再加第四个界面显示经验值只需要做绑定逻辑层一行不用改。经验满升级的场景就更体现了数据驱动的优势。升级意味着Level要加1、当前经验要减去升级所需经验、MaxExp可能要变化、等级数字要刷新、升级特效可能要播放。这些状态变化在逻辑层用一段代码一次性改完数据对应的字段即可。UI这边每个字段都独立监听、独立刷新数据层改了几处界面就会相应地局部刷新几处互不干扰不存在“刷新整个窗口导致状态闪烁”的问题。给个简化示例// 击杀怪物后 void OnKillMonster() { roleData.CurrentExp 100; if (roleData.CurrentExp roleData.MaxExp) { roleData.CurrentExp - roleData.MaxExp; roleData.Level 1; roleData.MaxExp CalculateMaxExpForLevel(roleData.Level); } }这段代码全部是在写数据没有一个字是在操作UI。但是界面上等级文字会自动变成新等级经验条会自动调整填充比例升级特效的触发条件如果做了绑定的话也会自动满足条件并播放。我第一次看到这个效果的时候说实话有种“哇这世界清静了”的感觉。4.5 列表和复用的处理数据驱动怎么搞定动态增删列表是UI开发里最麻烦的东西没有之一。背包、商店、任务、好友列表、排行榜满屏都是列表。传统写法里你得手写对象池、手写增删、手写排序、手写刷新某一行某个状态。写完能跑但维护起来头疼。YIUI的列表组件同样走数据驱动。你只需要提供一份“列表数据源”框架负责把数据映射成列表项UI。列表数据源新增一条、移除一条、排序变了UI会自动做对应的增加、删除、移动。使用过程中需要注意列表项的数量是有限的。如果你一口气往列表里塞五千条数据再好的框架也扛不住刷五千个UI节点。正确方式是配合虚拟列表——YIUI是支持虚拟列表的只实例化视口内能看到的那些列表项滚动时复用模板这在传统写法里是一个非常花时间的工程点框架直接帮你省掉了。我在项目里遇到过一个跟列表有关的经典问题给列表项里的按钮绑定点击事件结果发现点击事件传的参数永远是最后一条数据。这是写Unity列表闭包时的典型坑传统写法里要用局部变量接一下。换成YIUI的数据绑定模型以后这个坑就自然没了——按钮点击事件处理的是“当前列表项对应的数据实例”而不是一个被循环变量捕获的引用。这种“框架帮你把常见错误挡在门外”的地方用久了真的会回不去。5. 常见问题与性能优化实录那些我踩过的坑希望你别再踩5.1 UI卡顿绑定太“野”了高频刷新扛不住用得久了你就会遇到那类经典性能问题——界面卡顿。我用YIUI的过程中遇到的卡顿绝大多数不是框架本身慢而是绑定设计不够合理。最典型的错误是把一个变化极其频繁的数据直接绑定到UI上。比如有些开发者会把一个“当前时间”字段绑到某个不停显示时间的文本上每帧都变每帧都触发一次UI刷新。Text刷新本身不贵但如果你整个界面有几十个这种高频绑定那每帧加起来就有点意思了。另一个高频坑是在Awake或者窗口初始化阶段把数据全部Set了一遍导致大量UI刷新一次性狂发。YIUI本身应该有合并刷新的机制但我自己用的时候发现有些场景下的连续赋值还是会触发多次刷新。解决思路有两个一是把多个字段的赋值放到一个合并批量提交的接口里让它们只触发一次界面刷新二是重新审视哪些字段的UI需要实时绑定哪些用“提交时同步一份快照”就够了减少无效刷新。我这里想明确一点如果你的UI功能很简单列表不多、刷新不频繁那YIUI的自动刷新开销几乎可以忽略。真正需要花心思的是中大型项目里的高频数据UI比如实时战斗的伤害飘字、聊天消息流、活动倒计时、排行榜名次变动。这些场景下关注“刷新频率”和“刷新范围”两个指标基本就能找到性能瓶颈。5.2 数据不刷新绑定关系断了查了一圈才发现是命名问题数据驱动最大的噩梦是什么是改了数据界面不动。原本以为“不用手写刷新”能少出Bug但碰到这种问题的时候你会怀念“代码里明晃晃的RefreshUI调用”——至少你能搜到它。YIUI里数据不刷新我总结下来不外乎以下几个原因字段名对不上。编辑器里绑定的字段名和数据模型里的字段名差了一个字母框架找不到绑定关系界面自然不动。这个是最常见的而且报错不一定明显有时候只会默默地在日志里打一条警告很容易忽略。给字段赋值的不是你绑定的那个数据实例。界面上绑定的是A对象你代码里改的是B对象的字段界面当然不刷新。尤其新手容易踩这个坑从列表里取数据的时候取出来的是拷贝而不是引用改了拷贝对原数据毫无影响。绑定了但被其他代码覆盖了显示。有时候界面其实刷新了但界面脚本里别处有一段代码又给它赋值了把刷新结果覆盖掉了。这种问题最难查因为赋值来源不止一个你得全局搜索那个组件上到底有哪些地方在赋值。我自己的排查套路是三步走先看数据有没有真的改成功打个Log输出一下再看绑定关系在编辑器里有没有正确连接检查字段名是否匹配最后看有没有其他的UI逻辑覆盖了显示结果。按这个顺序排查绝大多数问题都能定位到。另外一个心得用好Log工具。YIUI内部应该是有一些调试开关或者日志输出的开发阶段把日志等级调到最详细绑定失败、刷新失败这类问题会在日志里直接打出线索来。不要一上来就对着代码发呆看日志永远是第一步。5.3 内存与GC数据驱动不等于放任不管数据驱动的代价之一是会产生一些临时对象。绑定关系的每一次解析、事件通知的每一次派发如果实现得不够讲究都可能产生GC Alloc。在移动端这种对GC敏感的环境里这确实是个需要留意的问题。我的经验是开发和测试阶段要时不时看一下Profiler留意UI相关的GC Alloc。YIUI本身在GC方面已经做了不少优化比如对象池、事件派发的缓存机制。但在业务代码层面你还是要注意一些自己挖的坑比如频繁创建列表项数据、频繁产生装箱类型把结构体当对象赋给接口类型等。另外一个容易忽略的点是列表关闭后数据有没有引用残留。如果窗口关闭了但窗口持有的数据模型还被逻辑层引用着那这个窗口释放不掉内存会悄悄涨。用YIUI的实体生命周期机制可以一定程度上自动释放窗口相关的数据但前提是你得遵循框架的规范来创建和销毁窗口不能用new随便new一个窗口实体出来。5.4 我压箱底的一个小技巧批量提交多个字段的变更最后分享一个我在项目中用得很顺手的技巧。当需要一次性修改多个相关字段、并且希望它们只触发一次界面刷新时我一般不会挨个赋值而是把这次修改里的所有字段赋值写在一起利用YIUI提供的某种“批量变更”能力统一提交。这么做的好处很直观界面不会刷新两次、不会出现中间态闪烁。比如升级时经验、等级、经验上限三个字段要同时改如果分三次赋值界面上可能出现“等级先变了经验条还是满的”这种不协调的中间态。批量提交之后界面会等到所有字段都改完再统一刷新显示效果就自然得多。在具体项目里你先在逻辑层组装好一个“最终状态”的数据然后一次性写到绑定数据上这种“先算后写”的思维是数据驱动开发里很重要的一个习惯。不要把UI刷新当作一个“用来确认结果的手段”要把它当成一个“数据最终状态的呈现”。先保证数据状态正确UI正确是自然而然的事。6. 我对YIUI的整体判断值不值得学习什么场景下用它最后一个章节聊点感性的东西。大数据驱动的框架学了到底值不值我个人的判断是如果你的项目选择的是ET框架那YIUI几乎是必须要了解一下的因为它和ET的结合程度决定了它能极大简化UI层的开发。如果你的项目不用ET那是否引入YIUI要看团队的学习成本和项目的具体复杂度——毕竟它依赖ET的实体体系和异步模型这个前提改变不了。如果你的项目是一个中大型游戏UI界面多、跨界面数据共享频繁、策划需求变动快那数据驱动的收益会非常巨大。反过来如果你只是做一个很轻量的小游戏UI就两三个界面数据也不复杂那老老实实用UGUI手写可能反而更快——没必要为了用框架而用框架。我在实际项目中体会到的最深的一点是数据驱动不只是一套代码框架更是一套思维方式。它逼着你先想清楚“界面到底依赖哪些数据”再动手做界面。这个习惯一旦养成你做任何UI逻辑的时候思路都会清晰很多。哪怕是哪天不用YIUI了用回UGUI或者FairyGUI这种“先数据后界面”的设计思路也依然能帮你写出更健壮的代码。当然YIUI也不是没有缺点。它的社区资料相比UGUI和FairyGUI还是要少一些遇到冷门问题的时候搜索引擎能帮上的忙有限很多时候得自己看源码。但换个角度想能逼着你去读一读源码的框架反而能让你对它理解得更透彻。我就是翻了几次YIUI的源码才真正搞清楚数据绑定和窗口生命周期里面那些设计上的精妙之处。如果你准备入坑我建议你先别看太多资料直接照着官方示例项目跑一遍然后试着把一个自己熟悉的界面用YIUI重写一遍感受一下数据驱动的开发节奏。跑完这个流程你心里自然就有答案了。
返回列表