基于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,一经查实,立即删除!

相关文章

如何在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显式更新文档的方…

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

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

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

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

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

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

Acwing1069. 凸多边形的划分

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

徐磊(Devops):一名写了十几年代码但还没写够的程序员

徐磊(Devops 社区领袖)【个人介绍】徐磊,微软MVP(微软最有价值专家,大中华区域社区技术总监,Devops 社区领袖),从事过网管、技术支持、网络、软件开发等工作,一名写了十几…

AcWing 320. 能量项链

AcWing 320. 能量项链 题意&#xff1a; 题解&#xff1a; 和环形石头合并基本一样 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) printf("%s %d\n",a,b); typedef long long ll; using namespace std;inline int read(){int s0,w1;char c…

ERP不规范,同事两行泪

最近的很多次对外交流&#xff0c;都聊到了ERP建设的话题&#xff0c;并且无一例外的不那么让人省心&#xff0c;回想我这么多年走过的ERP坑坑路&#xff0c;在这里也写下经验和总结&#xff0c;希望能给正在或者即将走上ERP建设路的企业一些思考和帮助。导读1、几个瞎眼而普遍…

长沙.NET社区之光

奈何万事开头难迎着改革开放四十年带来的春风&#xff0c;长沙的互联网生态环境以唐胡子俱乐部为首的一众互联网社群将长沙互联网的环境推上了一个新的台阶。年底&#xff0c;我与有幸一起共事的溪源兄&#xff0c;下班后一起闲聊&#xff0c;觉着长沙的.NET的生态环境亟待改善…

高级进阶:Azure DevOps搞定.NET Core编译版本号自增

点击上方蓝字关注“汪宇杰博客”熟悉.NET Framework的人知道&#xff0c;我们可以通过指定AssemblyVersion为10.0.*来让编译器自增版本号。但是.NET Core和.NET Standard不行。即使有MSBump这样的开源项目&#xff0c;也有一定的缺陷。一般这样的需求会出现在CI/CD服务器上。我…

Newbe.Claptrap - 一套以 “事件溯源” 和“Actor 模式”作为基本理论的服务端开发框架...

本文是关于 Newbe.Claptrap 项目主体内容的介绍&#xff0c;读者可以通过这篇文章&#xff0c;大体了解项目内容。轮子源于需求随着互联网应用的蓬勃发展&#xff0c;相关的技术理论和实现手段也在被不断创造出来。诸如 “云原生架构”、“微服务架构”、“DevOps” 等一系列关…

NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

对于普通系统或者服务来说&#xff0c;一般通过打日志来进行埋点&#xff0c;然后再通过elk或splunk进行定位及分析问题&#xff0c;更有甚者直接远程服务器&#xff0c;直接操作查看日志&#xff0c;那么&#xff0c;随着业务越来越复杂&#xff0c;企业应用也进入了分布式服务…

Tree UVALive - 8212

Tree UVALive - 8212 题意&#xff1a; 有n个点&#xff0c;k个颜色&#xff0c;每个点都要被染色&#xff0c;相同颜色之间的边算是被该颜色覆盖&#xff0c;问有多少边被所有颜色覆盖 题解&#xff1a; 题目给的是无根树&#xff0c;我们可以将1默认为根然后求所有点的子…

dotnetcore-officeaddin-toolbox : Office 365 Add-in开发人员的工具箱

在上一篇文章&#xff08;.NET Core开源行动&#xff1a;一键创建Excel Add-in&#xff09; 中我给大家展示了一套为Office 365 Add-in开发人员准备的模板库&#xff0c;你可以通过 dotnet new excel & dotnet run 命令即可完成一个新的Add-in的创建和运行。关于如何加载这…

Asp.Net Core对接钉钉群机器人

钉钉作为企业办公越来越常用的软件&#xff0c;对于企业内部自研系统提供接口支持&#xff0c;以此来打通多平台下的数据&#xff0c;本次先使用最简单的钉钉群机器人完成多种形式的消息推送&#xff0c;参考钉钉开发文档中自定义机器人环节&#xff0c;此次尝试所花的时间不多…

转录组无参比对教程

写在前面 2023年将结束&#xff0c;小杜的生信笔记分享个人学习笔记也有2年的时间。在这2年的时间中&#xff0c;分享算是成为工作、学习和生活中的一部分。自己为了运行和维护社群也算花费大量的时间和精力&#xff0c;自己认为还算满意吧。对于个人来说&#xff0c;自己一直…

.NET Core开源行动:一键创建Excel Add-in

作为.NET Core开源行动的一部分&#xff0c;我此前已经创建和发布了一套基于.NET Core的Office 365开发模板库&#xff0c;是针对Microsoft Graph开发的场景的&#xff0c;有兴趣可以参考 https://github.com/chenxizhang/dotnetcore-office365dev-templates-msgraph &#xff…

【学习笔记】最小生成树系列的必做经典题

最小生成树系列【模板】最小生成树prim算法kruskal算法Borůvka (Sollin)算法次小生成树最小生成树计数最优比率生成树最小乘积生成树最小度限制生成树最小方差树【模板】最小生成树 prim算法 最小生成树的prim\text{prim}prim类似于最短路的dijkstra\text{dijkstra}dijkstra…

通过 Azure Pipelines 实现持续集成之docker容器化

IntroAzure DevOps Pipeline 现在对于公开的项目完全免费&#xff0c;这对于开源项目来讲无疑是个巨大的好消息&#xff0c;在 Github 的 Marketplace 里有个 Azure Pipeline&#xff0c;就是微软的 Azure DevOps Pipeline。实现 Docker 容器化的持续集成实现的目标&#xff1a…

Acwing 1082. 数字游戏

Acwing 1082. 数字游戏 题意&#xff1a; 现在大家决定玩一个游戏&#xff0c;指定一个整数闭区间 [a,b]&#xff0c;问这个区间内有多少个不降数。 题解&#xff1a; 利用数位dp的套路来做 我们还是利用前缀和来做 我们先求1~n中满足情况的个数 对于一个n位数&#xff0c;…