基于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示例:

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

using UnityEngine;
using XUUI;

public class Helloworld : MonoBehaviour
{
    Context context = null;

    void Start()
    {
        context = new Context(@"
            return {
                data = {
                    info = {
                        name = ‘John‘,
                    },
                },
                computed = {
                    message = function(data)
                        return ‘Hello ‘ .. data.info.name .. ‘~!‘
                    end
                },
                commands = {
                    click = function(data)
                        print(data.info.name..‘哈哈‘)
                    end,
                },
            }
        ");

        context.Attach(gameObject);
    }

    void OnDestroy()
    {
        context.Dispose();
    }
}

如上面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:

context = new Context(@"
            return {
                name  = ‘myapp‘,
                modules = {‘module1‘, ‘module2‘},
           }
        ");

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

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

module1代码如下:

return {
    data = {
        name = "haha",
        select = 0, -- ui通过 module1.select来绑定
    },

    commands = {
        click = function(data)
            module2.set_select(data.select) -- 可以调用别的模块exports的接口
            data.select = data.select == 0 and 1 or 0 -- command只能看到/修改自己的数据
        end,
    },

    computed = {
        info = function(data)
            return string.format(‘i am %s, my select is %d‘, data.name, data.select)
        end,
    },

    exports = {
        hello = function(p) -- 可以被其它module调用
            print(‘hello, p = ‘.. p)
        end,
    },
}

module2代码如下:

local data = {
    message = "hehe",
    select = 1,
}

return {
    data = data,

    commands = {
        click = function(data)
            module1.hello(1)
            data.select = data.select == 0 and 1 or 0
        end,
    },

    computed = {
        info = function(data)
            return string.format(‘message is %s, select is %d‘, data.message, data.select)
        end,
    },

    exports = {
        set_select = function(p)
            data.select = p
        end,
    },
}

需要注意的是:这里的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

时间: 2024-08-01 19:26:37

基于xlua和mvvm的unity框架的相关文章

转-基于NodeJS的14款Web框架

基于NodeJS的14款Web框架 2014-10-16 23:28 作者: NodeJSNet 来源: 本站 浏览: 1,399 次阅读 我要评论暂无评论 字号: 大 中 小 摘要: 在几年的时间里,Node.js逐渐发展成一个成熟的开发平台,吸引了许多开发者.有许多大型高流量网站都采用Node.js进行开发,像PayPal,此外,开发人员还可以使用它来开发一些快速移动Web框架. 下面就介绍14款基于Node.js的Web应用框架,大家不... 在几年的时间里,Node.js逐渐发展成一个成

基于NodeJS的14款Web框架

摘要: 在几年的时间里,Node.js逐渐发展成一个成熟的开发平台,吸引了许多开发者.有许多大型高流量网站都采用Node.js进行开发,像PayPal, 此外,开发人员还可以使用它来开发一些快速移动Web框架. 下面就介绍14款基于Node.js的Web应用框架,大家不... 在几年的时间里,Node.js逐渐发展成一个成熟的开发平台,吸引了许多开发者.有许多大型高流量网站都采用Node.js进行开发,像PayPal,此外,开发人员还可以使用它来开发一些快速移动Web框架. 下面就介绍14款基于

基于OpenGL ES 的深度学习框架编写

基于OpenGL ES的深度学习框架编写 背景与工程定位 背景 项目组基于深度学习实现了视频风格化和人像抠图的功能,但这是在PC/服务端上跑的,现在需要移植到移动端,因此需要一个移动端的深度学习的计算框架. 同类型的库 caffe-android-lib 目前应该是最便于集成使用的深度学习框架库. tensorflow和mxnet据说也有对应的android库,因时间原因暂未测试. CNNdroid,网址https://zhuanlan.zhihu.com/p/25259452,这个是用 ren

基于Doubango的iOS客户端开源框架

一.ios-ngn-statck工程 1.Tests ---功能测试 2.底层模块(c和c++) Doubango --- 基于3GPP IMS/RCS 并能用于嵌入式和桌面系统的开源框架 1) tinyWRAP --- c++代码,对c代码以面向面向对象的方式进行封装,提供给上层调用. 2) tinyDAV --- Doubango媒体音频/视频控制,tinyMedia核心框架 a) audio --- 音频 b) codecs --- 编解码器 c) msrp --- 文件传输 d)vide

基于redis AE的异步网络框架

最近一直在研究redis的源码,redis的高效率令人佩服. 在我们的linux机器上,cpu型号为, Intel(R) Pentium(R) CPU G630 @ 2.70GHz Intel(R) Pentium(R) CPU G630 @ 2.70GHz 上 set,get 都能达到每秒钟15W的请求处理量,真是佩服这代码的效率. 前几篇文章,主要是介绍了基本的代码,比如字符串处理,链表处理,hash等.这篇文章介绍网络的核心,基于事件反映的异步网络框架. 异步网络处理,是基于epoll的.

一个基于共享内存的ipc通信框架

一个基于共享内存的ipc通信框架 与共享内存相关的操作主要包括共享内存的初始化, 共享内存的释放, 共享内存的锁的相关操作, 在这里操作共享内存的环境是: 1 多个进程没有亲缘关系, 也没有server/client关系, 是多个不相关进程并发操作共享内存 2 共享内存一开始不存在, 由第一个访问他的进程创建 3 当共享内存退出时, 由最后一个离开的进程释放共享内存, 并清除信号量 在这个问题之中, 主要有两个比较大的问题: 1 怎样新建并初始化共享内存 新建共享内存的数据都可以用信号量来控制,

基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】

基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的rest服务,通常这些服务要不就是用于手机app的开发,要不就是提供给第三方开发者使用,不管哪种情况,你都需要提供详细的说明给别人,而Swagger就是为这种情况而生的,通过在接口上的注解,生成可供第三方模拟测试和阅读的接口列表,既美观又使用,真是行走江湖之必备良药. [XmPlatform原创,转载的

Smarge——基于HTML5 localStorage的key-value缓存框架

缓存是任何一个Web程序都需要重视的内容.受到Redis的启发,我想到开发一个基于HTML5 localStorage的key-value缓存框架,做了一些尝试之后,便有了Smarge这样一个产物. 大家都知道,HTML5的localStorage没有超时的机制,也不能存储数组和对象等类型,更没有命令空间等思想. 这些问题,在Smarge中都得到了解决. 项目地址:https://git.oschina.net/jiusem/Smarge.git 说明:Smarge1.0.js是完整的源代码,以

SpaceBase – 基于 Sass 的响应式 CSS 框架

SpaceBase 是一个基于 Sass 的响应式 CSS 框架.SpaceBase 是可以在建立和定制您的需要的一个样板层,它结合最佳实践为今天的响应式网页与我们对每一个项目中使用的核心组件. 在线演示      源码下载 您可能感兴趣的相关文章 网站开发中很有用的 jQuery 效果[附源码] 分享35个让人惊讶的 CSS3 动画效果演示 十分惊艳的8个 HTML5 & JavaScript 特效 Web 开发中很实用的10个效果[源码下载] 12款经典的白富美型 jQuery 图片轮播插件