xLua

Unity3D 下 Lua 编程解决方案
授权协议 MIT
开发语言 C/C++
所属分类 开发工具、 代码管理分析/审查/优化
软件类型 开源软件
地区 国产
投 递 者 史钊
操作系统 跨平台
开源组织 腾讯
适用人群 未知
 软件概览

Unity3D下Lua编程支持

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支持热补丁,这意味着你可以:

  1. 开发只用C#;

  2. 运行也是C#,性能可以秒杀lua;

  3. 出问题了才用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