xLua为Unity3D增加Lua脚本编程的能力,进而提供代码逻辑增量更新的可能。当然不仅仅如此,在coco2dx上的实践告诉我们,以Lua为主打语言的游戏客户端编程是可行的。
xLua的突破
xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是:
Unity3D全平台热补丁技术,可以运行时把C#实现(方法,操作符,属性,事件,构造函数,析构函数,支持泛化)替换成lua实现;
自定义struct,枚举在Lua和C#间传递无C# gc alloc;
编辑器下无需生成代码,开发更轻量;
更详细的特性、平台支持介绍请看这里。
安装
直接解压到Assets下可用。第一次使用建议把例子包也安装,运行看看效果。
如果希望安装到其它目录,请看FAQ相关介绍。
快速入门
一个完整的例子仅需3行代码:
下载xLua后解压到Unity工程Assets目录下,建一个MonoBehaviour拖到场景,在Start加入如下代码:
Lua.LuaEnv luaenv = new XLua.LuaEnv(); luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')"); luaenv.Dispose();
1、DoString参数为string,可输入任意合法的Lua代码,本示例在lua里调用C#的UnityEngine.Debug.Log打印了个日志。
2、一个LuaEnv实例对应Lua虚拟机,出于开销的考虑,建议全局唯一。
C#主动调用lua也很简单,比如要调用lua的系统函数,推荐方式是:
声明
[XLua.CSharpCallLua]public delegate double LuaMax(double a, double b);
绑定
var max = luaenv.Global.GetInPath<LuaMax>("math.max");
调用
Debug.Log("max:" + max(32, 12));
建议绑定一次,重复使用。生成了代码的话,调用max是不产生gc alloc的。
热补丁
xLua支持热补丁,这意味着你可以:
开发只用C#;
运行也是C#,性能可以秒杀lua;
出问题了才用Lua来改掉C#出问题的部位,下次整体更新时换回正确的C#;能做到用户不重启程序fix bug;
如果你仅仅希望用热更新来fix bug,这是强烈建议的做法。这里是使用指南。
通过xLua运行Lua程序 导入网上下载的 xLua 包,其中也包涵示例代码和场景。 using XLua; private LuaEnv luaenv; void Start () { //构建Lua虚拟机 luaenv = new LuaEnv(); //通过 Lua 语法(执行一个字符串)
一:什么是热更新? 热更新是指当游戏出现bug,或者需要修改,增加某个功能的时候,我们不需要重新下载安装包,就可以更新游戏内容 游戏上线后,遇见bug或者需要更新内容,一般有两种做法: 第一种:重新打包上传一个新的安装包到应用商店(需要审核,费时间),然后让玩家下载新的客户端安装包(需要重新下载,费流量) 第二种:在游戏内更新,游戏启动时去下载需要更新的资源 第一种我们一般称为游戏大版本更新,第二
简述:应用场景,快速学习-----------------------------博主:mx Xlua-热更新优势: 直观优势 可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现; 出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc;【名词释义:GC ALLOC大概就是托管堆临时分配的内存】 编辑器下无需生成代码,开发更轻量; 并且支持为如下C#
近期项目升级到Unity2018之后,需要使用IL2CPP进行打包,导致之前使用的直接替换 .dll 的更新方式无法继续使用,决定接入XLua进行热更,此篇文章做个简单的爬坑记录。 目录 一、更换热更方式的原由 二、选择热更框架 三、XLua导入工程 四、XLua接入 1、luaconfig 2、pdf重写 3、Bridge桥接类 五、坑点梳理(持续
最近项目很忙好久没更新了。 虽然一直在用Xlua,也对lua实现原理有稍微的了解。但仍然不是很理解C#到底是如何和lua进行交互的,比如在lua中写一段CS.UnityEngine.GameObject到底是如何调用到c#中的。上周也是浅浅的学习了下,今天来记录下解析过程。 入口:LuaEnv.Init() string init_xlua = @" local
经典的 "Hello world" 的程序总是被用来开始介绍一种语言。在 Lua 中,写一个这样的程序很简单: print("Hello world") 在 Lua 中,语句之间可以用分号 ";" 隔开,也可以用空白隔开。一般来说,如果多个语句写在同一行的话,建议总是用分号隔开。 Lua 有好几种程序控制语句,如: 条件控制: if 条件 then … elseif 条件 then … else
学习 Lua 过程中的一些笔记整理,包括Lua 基础知识、环境与模块、函数与面向对象、标准库、协程 Coroutine等。
本文向大家介绍Lua下基本的网络编程示例,包括了Lua下基本的网络编程示例的使用技巧和注意事项,需要的朋友参考一下 Lua是高度灵活的语言,它往往是在多个平台,包括Web应用程序中使用。成立2004年的Kepler社区提供Lua的Web组件开放源码。 虽然,也有使用Lua已经开发了其他的web框架,我们将主要集中在Kepler社区提供的组件。 应用程序和框架 Orbit 是一个lua的M
本文向大家介绍举例详解Lua中的协同程序编程,包括了举例详解Lua中的协同程序编程的使用技巧和注意事项,需要的朋友参考一下 协同程序是协同的性质,可以把两个或更多的方法以可控制的方式执行。随着协同程序,在任何给定的时间,只有其协同程序运行之一,这在运行协同程序只能暂停其执行时,明确要求暂停。 上述定义可能看起来模糊。来告诉它更清楚,假设我们有两个方法,一个主程序方法和协同程序。当我们使用恢复功能
当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的实施。 版本一 例10.1 备份脚本——版本一 #!/usr/bin/python # Filename: backup_ver1.py importos importtime # 1. The files and directories to be backed up are specified in a list. sour
本文向大家介绍Android编程画图之抗锯齿解决方法,包括了Android编程画图之抗锯齿解决方法的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了Android编程画图之抗锯齿解决方法。分享给大家供大家参考,具体如下: 在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿。其实Android自带了解决方式。 方法一:给Paint加上抗锯齿标志。然后将Paint对象作为参数传给ca
本文向大家介绍跟我学习javascript解决异步编程异常方案,包括了跟我学习javascript解决异步编程异常方案的使用技巧和注意事项,需要的朋友参考一下 一、JavaScript异步编程的两个核心难点 异步I/O、事件驱动使得单线程的JavaScript得以在不阻塞UI的情况下执行网络、文件访问功能,且使之在后端实现了较高的性能。然而异步风格也引来了一些麻烦,其中比较核心的问题是: 1、函数
本文向大家介绍lua获取未来某时间点的时间戳解决方案,包括了lua获取未来某时间点的时间戳解决方案的使用技巧和注意事项,需要的朋友参考一下 最近在做游戏定时推送,犹如第二天9点通知玩家领取奖励之类的需求,要求获取第二天9点的时间戳,以前用JS写过类似的需求,JS中的Date类用起来比较方便,很多东西已经帮忙弄好了,最主要的还是会自动处理时间和日期的自己进阶吧。最近写lua也碰到类似的需求,但看过l