基于xlua和mvvm的unity框架

1、框架简介

这两天在Github上发现了xlua的作者车雄生前辈开源的一个框架—XUUI,于是下载下来学习了一下。XUUI基于xlua,又借鉴了mvvm的设计概念。xlua是目前很火的unity热更方案,不仅支持纯lua脚本热更,也可以做 C# 代码的bug hotfix,而mvvm框架呢,在前端开发中应用很广,我周围同事在做wpf开发时也用到了mvvm框架,mvvm模式在unity开发中也同样适用,github上可以找到不少开源案例。XUUI主要有两大核心能力:一是支持MVVM的单向、双向绑定,二是框架应用时可以做模块加载、模块刷新、模块间数据隔离、模块间可控交互。 

2、框架特点

作者在文档中介绍了XUUI框架的特点:一是可以和任意UI库配合,ugui,ngui,fairyGUI,你自己倒腾的UI库都可以;二是支持把本框架作为一个mvvm驱动器,纯用C#写逻辑;三是支持“计算属性”:“计算属性”依赖的各属性发生改变会触发“计算属性”的重计算;四是可随时绑定View以及解绑定。 

3、使用示例

下载项目到本地,可以看到作者提供了几个使用示例。使用时要设置好绑定信息,给各个UI元素(比如Button、Text、InputField等)添加适配器,可以通过Component/XUUI菜单或者手动到XUUI\Scripts\UGUIAdapter目录找脚本拖放到UI上,然后设置BindTo属性即可,XUUI作者已经提供了Button、Text、Dropdown、InputField的适配器,其他ui元素比如Toggle就需要自己去编写了,作者已经提供了接口模板,自己实现其他适配器也不难。先来看一下Helloworld示例:

640?wx_fmt=png

这个示例中,有三个ui元素,绑定信息如下:InputField: info.name;Text      : message,这是个“计算属性”,计算时用了info.name,当info.name发生变化会触发message重新计算,并自动更新Text;Button    : click,这会绑定到一个click command上。C#代码如下:

640?wx_fmt=png

如上面C#代码所示,首先要new一个Context,参数是个lua脚本,该lua脚本返回一个table,table需要包含几个特殊的字段: data就是ViewModle(VM);computed中引用到的VM元素,在其依赖的VM元素发生改变会自动重新计算并同步到各个绑定了它(比如上例的message)的节点;commands是类似按钮点击事件绑定的响应方法,随后,调用Context的Attach方法进行绑定。

 

4、XUUI中几个重要的类

(1)Context:启动框架的方法就是new一个Context实例,并传入lua脚本,在Context的构造函数中,会初始化好lua运行环境(即LuaEnv),并解析传入的lua脚本,对框架各模块进行配置,Context实现了IDisposable接口,以便对一些非托管资源进行手动的垃圾回收。

(2)DataConsumer:如果ui Adapter需要监听VM变化,须实现DataConsumer接口(可以不显式声明实现,只要有DataConsumer声明的接口即可)

(3)DataProducer:如果ui Adapter需要把数据同步回VM,须实现DataProducer接口

(4)EventEmitter:如果ui Adapter需要产生一个事件,须实现EventEmitter接口

 

5、XUUI框架的应用

在实际使用中,并不会像上面HelloWorld实例那么简单,作者也提供了在实际使用时的示例,首先new一个Context,Context的构造函数传入的是一个含modules字段以及name字段的table:

640?wx_fmt=png

执行上面代码,框架会做这些事情: 加载myapp.module1,myapp.module2,加载的规则和require是一致的;为这两个设置独立的沙盒,各模块即使定义了全局变量也互不影响,一定程度上减轻不同模块开发者由于沟通不足或者笔误引发的模块间冲突;模块间数据隔离:模块也可以定义data、commands、computed,在模块定义的commands和computed只能看到本模块的data; 模块间调用:通过exports字段可以导出一些函数供其它模块调用,其它模块可以通过“模块名.函数名”调用

* 支持模块刷新(reload),reload后data变动会更新UI,监听原先commands也会自动更新到新的commands,computed会自动重新计算并更新UI。

module1代码如下:

640?wx_fmt=png

module2代码如下:

640?wx_fmt=png

需要注意的是:这里的UI不像逻辑那样划分模块,通过“模块名.模块内路径”去进行数据/响应的绑定,比如moudle1.select,module2.click等等。 

6、最后

昨天才接触到这个框架,XUUI框架下载量并不多,今天大概学习了一下,分享一下学习成果,总的来说,这个框架集成了xlua和mvvm,有很多值得借鉴的地方,很适合ui模块的开发。博客内容有部分是从作者文档里抄下来的,因为怕自己描述不准确。分享一下,希望这个框架能像基于ulua的SimpleFramework一样被更多开发者使用~

项目地址:https://github.com/chexiongsheng/XUUI


原文地址:https://www.cnblogs.com/IAMTOM/p/10445859.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


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

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

相关文章

A - Tit for Tat CodeForces - 1516A

A - Tit for Tat CodeForces - 1516A 题意: 一个长度为 n 的数组,现在希望你对这个数组进行至多k次操作:在数组中选择 2 个不同的元素,将第一个元素加 1 ,然后从第二个元素减 1 。不过他有一个要求,进行操…

Codeforces Round #703 (Div. 2) 题解

文章目录A. Shifting StacksB. Eastern ExhibitionC. Guessing the GreatestD. Max MedianE. Paired PaymentF. Pairs of Paths#703 (Div. 2)A. Shifting Stacks 从左往右构造递增0,1,2...,如果这样都不能递增就肯定无解 雷区:不能用等差数列算个数&am…

AGAGA XOOORRR CodeForces - 1516B

AGAGA XOOORRR CodeForces - 1516B 题意: 给定一个长度为n的序列,对其进行若干次操作,每次操作将某相邻两数变为他们的异或和(操作后序列长度减一)。问是否可以经过若干次操作,得到一个长度至少为2且所有…

2.8模拟总结

前言 80pts 303020 rnk10 三个暴力分… T2拿虚树玩了半天结果假了qwq 乍一看似乎都挺可做的。 但是一道都做不出来 (觉得写考场过程有点流水账,不写了,一些想说的写在对应题目里吧) 题目解析 T1 三角查找(triangle&…

如何在ASP.NET Core中使用JSON Patch

原文: JSON Patch With ASP.NET Core作者:.NET Core Tutorials译文:如何在ASP.NET Core中使用JSON Patch地址:https://www.cnblogs.com/lwqlun/p/10433615.html译者:Lamond LuJSON Patch是一种使用API显式更新文档的方…

Codeforces Round #709 (Div. 2, based on Technocup 2021 Final Round) 题解

文章目录A. Prison BreakB. Restore ModuloC. Basic DiplomacyD. PlaylistE. Skyline PhotoF. Useful Edges#709 (Div. 2)A. Prison Break 就是每个监狱破一扇门,输出aba\times bab即可 B. Restore Modulo 就是取模意义下的操作,分大小操作&#xff0…

351E. Jeff and Permutation

351E. Jeff and Permutation 题意: 一个长度为n的序列,你可以选择一些位置,使其变成相反数,问逆序对最少是多少? 题解: 对于第i位,我们开始考虑他能决定的逆序对?对于其他任意位…

.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接

众所周知在.NET下的RSA类所生成的密钥为Xml格式,而其他语言比如java一般使用pkcs8格式的密钥,JavaScript一般使用pkcs1格式。我们在开发过程中很可能遇到需要与其他语言开发的api进行对接,如果遇到RSA加密解密,我们肯定需要保证ke…

2.9模拟总结

文章目录前言题目解析序列计数(sequence)T2 网格选点(grid)T3 孤立点集(isolated)代码T1T2T3总结前言 180pts 3050100 rnk10 题目比较简单的一场考试。 不太满意。 T3是做过的原题,切了不算啥…

AtCoder Beginner Contest 203(Sponsored by Panasonic)题解

文章目录A - ChinchirorinB - AtCoder CondominiumC - Friends and Travel costsD - PondE - White PawnF - WeedABC203A - Chinchirorin 三个条件if判 #include <cstdio> int main() {int a, b, c;scanf( "%d %d %d", &a, &b, &c );if( a b ) …

AcWing 1068. 环形石子合并

AcWing 1068. 环形石子合并 题意&#xff1a; n堆石头围成一个圈&#xff0c;然后将相邻两堆合并成新的一堆&#xff0c;得分为新的一堆的石头数 问最高得分合最低得分 题解&#xff1a; 很简单&#xff0c;区间dp的模板题 和这个题一样 状态转移方程&#xff1a; dpmax[i]…

2.10模拟总结

文章目录前言题目解析随机减法&#xff08;calculate&#xff09;大图书馆&#xff08;bibliotheca&#xff09;子串选取 &#xff08;substr&#xff09;代码T1T2T3总结前言 200pts 4010060 rnk3 拿到牌勒嘿嘿嘿&#xff08;脑补流口水黄豆&#xff09; T3两个log想在ybt的机…

ABP VNext 微服务演示,项目状态和路线图

在ABP vNext上的第一个公告之后,我们对代码库进行了很多改进(GitHub存储库上的1100多次提交).我们已经创建了功能,示例,文档等等.在这篇文章中,我想告诉你一些新闻和项目的状态.ABP微服务演示解决方案ABP框架的主要目标之一是提供创建微服务解决方案的便利基础设施.我们一直在努…

加分二叉树

加分二叉树 题意&#xff1a; 给你一个数的中序表达式&#xff0c;然后一颗子树的分数左子树的分数*右子树的分数根的分数 给你所有点的分数&#xff0c;让你构造出分值最大的树&#xff0c;输出前序遍历 题解&#xff1a; 区间dp问题 设dp[i][j]表示中序遍历是w[i~j]的所有…

AtCoder ZONe Energy Programming Contest 题解

文章目录A - UFO InvasionB - Sign of FriendshipC - MAD TEAMD - Message from AliensE - SneakingF - Encounter and FarewellZONe Energy Programming ContestA - UFO Invasion 太简单了。 #include <cstdio> char ch[10] { Z, O, N, e }; char s[20];int main() {…

2.11模拟总结

前言 145&#xff08;175&#xff1f;&#xff09;pts 100450&#xff08;30&#xff1f;&#xff09; rnk11&#xff08;8&#xff1f;&#xff09; 之所以有括号是因为T3莫名其妙的TLE了&#xff1f; 考后我一模一样的码再交一遍30分就到手了… 应该不是我的问题吧&#xff…

[aspnetcore.apidoc]一款很不错的api文档生成工具

简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger最初我们也有在试用swagger&#xff0c;但总是有些感觉&#xff0c;感觉有点不满意&#xff0c;就但从api文档角度来说&#xff0c;从前后端文档沟通角度来讲apidoc的表现形式&#xff0c;要比swagger简单的多&…

【学习笔记】浅谈短小可爱的左偏树(可并堆)

文章目录左偏树左偏树的合并(merge)操作例题罗马游戏[Apio2012]dispatching[JLOI2015]城池攻占[Baltic2004]sequence左偏树 左偏树是一个堆&#xff0c;而且是一个可并堆&#xff0c;所以一定有权值的限制 以小根堆为例&#xff0c;那么必须满足节点权值小于左右儿子权值&…

2.12 模拟

文章目录前言题目解析染色计划&#xff08;color&#xff09;奇度边集&#xff08;edges&#xff09;猜拳游戏&#xff08;guess&#xff09;代码T1T2LCT整体二分总结前言 120pts 期望&#xff1a;4010020160 实际&#xff1a;406020120 rnk 9 我yue了。 怎么又是不可抗力性挂…

Acwing1069. 凸多边形的划分

Acwing1069. 凸多边形的划分 题意&#xff1a; 一个N个顶点的凸多边形&#xff0c;划分成N-2个互不相交的三角形&#xff0c;对于每个三角形&#xff0c;其三个顶点的权值相乘都可得到一个权值乘积&#xff0c;试求所有三角形的顶点权值乘积之和至少为多少。 题解&#xff1…