Xlua热更新解决方案相关API及方法

C# API
LuaEnv类

object[] DoString(string chunk, string chunkName = "chuck", LuaTable env = null)

描述:
执行一个代码块。
参数:
chunk: Lua代码;
chunkName: 发生error时的debug显示信息中使用,指明某某代码块的某行错误;
env :为这个代码块;
返回值:
代码块里return语句的返回值;
比如:return 1, “hello”,DoString返回将包含两个object, 一个是double类型的1, 一个是string类型的“hello”
例子:

LuaEnv luaenv = new LuaEnv();
    object[] ret = luaenv.DoString("print(‘hello’)\r\nreturn 1")
UnityEngine.Debug.Log("ret="+ret[0]);
luaenv.Dispose()

T LoadString(string chunk, string chunkName = “chunk”, LuaTable env = null)
描述:
加载一个代码块,但不执行,只返回类型可以指定为一个delegate或者一个LuaFunction
参数:
chunk: Lua代码;
chunkName: 发生error时的debug显示信息中使用,指明某某代码块的某行错误;
env :为这个代码块;
返回值:
代表该代码块的delegate或者LuaFunction类;

LuaTable Global;
描述:
代表lua全局环境的LuaTable

void Tick()
描述:
清除Lua的未手动释放的LuaBase(比如,LuaTable, LuaFunction),以及其它一些事情。
需要定期调用,比如在MonoBehaviour的Update中调用。
void AddLoader(CustomLoader loader)
描述:
增加一个自定义loader
参数:
loader:就一个回调,其类型为delegate byte[] CustomLoader(ref string filepath),当一个文件被require时,这个loader会被回调,其参数是require的参数,如果该loader找到文件,可以将其读进内存,返回一个byte数组。如果需要支持调试的话,而filepath要设置成IDE能找到的路径(相对或者绝对都可以)
void Dispose()
描述:
Dispose该LuaEnv。
LuaEnv的使用建议:全局就一个实例,并在Update中调用GC方法,完全不需要时调用Dispose

LuaTable类
T Get(string key)
描述:
获取在key下,类型为T的value,如果不存在或者类型不匹配,返回null;

T GetInPath(string path)
描述:
和Get的区别是,这个会识别path里头的“.”,比如var i = tbl.GetInPath(“a.b.c”)相当于在lua里头执行i = tbl.a.b.c

void SetInPath(string path, T val)
描述:
和GetInPaht对应的setter;

void Get<TKey, TValue>(TKey key, out TValue value)
描述:
上面的API的Key都只能是string,而这个API无此限制;

void Set<TKey, TValue>(TKey key, TValue value)
描述:
对应Get<TKey, TValue>的setter;

T Cast()
描述:
把该table转成一个T指明的类型,可以是一个加了CSharpCallLua声明的interface,一个有默认构造函数的class或者struct,一个Dictionary,List等等。

void SetMetaTable(LuaTable metaTable)
描述:
设置metaTable为table的metatable

LuaFunction类
注意:用该类访问Lua函数会有boxing,unboxing的开销,为了性能考虑,需要频繁调用的地方不要用该类。建议通过table.Get获取一个delegate再调用(假设ABCDelegate是C#的一个delegate)。在使用使用table.Get之前,请先把ABCDelegate加到代码生成列表。
object[] Call(params object[] args)
描述:
以可变参数调用Lua函数,并返回该调用的返回值。

object[] Call(object[] args, Type[] returnTypes)
描述:
调用Lua函数,并指明返回参数的类型,系统会自动按指定类型进行转换。

void SetEnv(LuaTable env)
描述:
相当于lua的setfenv函数。

Lua API

CS对象
CS.namespace.class(…)
描述:新建一个C#对象实例,例如:
local v1=CS.UnityEngine.Vector3(1,1,1)
CS.namespace.class.field
描述:访问一个C#静态成员,例如:
Print(CS.UnityEngine.Vector3.one)
CS.namespace.enum.field
描述:访问一个枚举值

typeof函数
类似C#里头的typeof关键字,返回一个Type对象,比如GameObject.AddComponent其中一个重载需要一个Type参数,这时可以这么用
newGameObj:AddComponent(typeof(CS.UnityEngine.ParticleSystem))

无符号64位支持
uint64.tostring
描述:无符号数转字符串。
uint64.divide
描述:无符号数除法。
uint64.compare
描述:无符号比较,相对返回0,大于返回正数,小于返回负数。
uint64.remainder
描述:无符号数取模。
uint64.parse
描述:字符串转无符号数。

xlua.structclone
描述:克隆一个c#结构体
cast函数
指明以特定的接口访问对象,这在实现类无法访问的时候(比如internal修饰)很有用,这时可以这么来(假设下面的calc对象实现了C#的PerformentTest.ICalc接口):
cast(calc, typeof(CS.PerformentTest.ICalc))

然后就木有其它API了
访问csharp对象和访问一个table一样,调用函数跟调用lua函数一样,也可以通过操作符访问c#的操作符,下面是一个例子:

local v1=CS.UnityEngine.Vector3(1,1,1) 
local v2=CS.UnityEngine.Vector3(1,1,1) 
v1.x = 100 
v2.y = 100 
print(v1, v2)
local v3 = v1 + v2
print(v1.x, v2.x) 
print(CS.UnityEngine.Vector3.one)
print(CS.UnityEngine.Vector3.Distance(v1, v2))

类型映射

基本数据类型
C#类型 Lua类型

sbyte,byte,short,ushort,int,uint,double,char,float	number
decimal	userdata
long,ulong	userdata/lua_Integer(lua53)
bytes[]	string
bool	boolean
string	string

复杂数据类型
C#类型 Lua类型

LuaTable	table
LuaFunction	function

class或者 struct的实例

userdata,table
method,delegate	function

LuaTable:
C#侧指明从Lua侧输入(包括C#方法的输入参数或者Lua方法的返回值)LuaTable类型,则要求Lua侧为table。或者Lua侧的table,在C#侧未指明类型的情况下转换成LuaTable。
LuaFunction:
C#侧指明从Lua侧输入(包括C#方法的输入参数或者Lua方法的返回值)LuaFunction类型,则要求Lua侧为function。或者Lua侧的function,在C#侧未指明类型的情况下转换成LuaFunction。
LuaUserData:
对应非C# Managered对象的lua userdata。
class或者 struct的实例:
从C#传一个class或者struct的实例,将映射到Lua的userdata,并通过__index访问该userdata的成员
C#侧指明从Lua侧输入指定类型对象,Lua侧为该类型实例的userdata可以直接使用;如果该指明类型有默认构造函数,Lua侧是table则会自动转换,转换规则是:调用构造函数构造实例,并用table对应字段转换到c#对应值后赋值各成员。
method, delegate:
成员方法以及delegate都是对应lua侧的函数。
C#侧的普通参数以及引用参数,对应lua侧函数参数;C#侧的返回值对应于Lua的第一个返回值;引用参数和out参数则按序对应于Lua的第2到第N个参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
## C#下Lua编程支持 xLua为Unity、 .Net、 Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用。 ## xLua的突破 xLua在功能、性能、易用性都有不少突破,这几方面分别最具代表性的是: * 可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现; * 出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc; * 编辑器下无需生成代码,开发更轻量; 更详细的特性、平台支持介绍请看[这里](Assets/XLua/Doc/features.md)。 ## 安装 打开zip包,你会看到一个Assets目录,这目录就对应Unity工程的Assets目录,保持这目录结构放到你的Unity工程。 如果希望安装到其它目录,请看[FAQ](Assets/XLua/Doc/faq.md)相关介绍。 ## 文档 * [常见问题解答](Assets/XLua/Doc/faq.md):常见问题都总结在这里,初使用大多数问题都可以在这里找到答案。 * (必看)[XLua教程](Assets/XLua/Doc/XLua教程.md):教程,其配套代码[这里](Assets/XLua/Tutorial/)。 * (必看)[XLua的配置](Assets/XLua/Doc/configure.md):介绍如何配置xLua。 * [补丁操作指南](Assets/XLua/Doc/hotfix.md):介绍如何使用补丁特性。 * [XLua增加删除第三方lua库](Assets/XLua/Doc/XLua增加删除第三方lua库.md):如何增删第三方lua扩展库。 * [XLua API](Assets/XLua/Doc/XLua_API.md):API文档。 * [生成引擎二次开发指南](Assets/XLua/Doc/custom_generate.md):介绍如何做生成引擎的二次开发。 ## 快速入门 一个完整的例子仅需3行代码: 安装好xLua,建一个MonoBehaviour拖到场景,在Start加入如下代码: ```csharp XLua.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的系统函数,推荐方式是: * 声明 ```csharp [XLua.CSharpCallLua] public delegate double LuaMax(double a, double b); ``` * 绑定 ```csharp var max = luaenv.Global.GetInPath("math.max"); ``` * 调用 ```csharp Debug.Log("max:" + max(32, 12)); ``` 建议绑定一次,重复使用。生成了代码的话,调用max是不产生gc alloc的。 ## 补丁 * 侵入性小,老项目原有代码不做任何调整就可使用。 * 运行时影响小,不打补丁基本和原有程序一样。 * 出问题了可以用Lua来打补丁,这时才会走到lua代码逻辑; [这里](Assets/XLua/Doc/hotfix.md)是使用指南。 ## lua5.3 vs luajit xLua有两个版本,分别集成了lua5.3和luajit,一个项目只能选择其一。这两个版本C#代码是一样的,不同的是Plugins部分。 lua5.3的特性更丰富些,比如支持原生64位整数,支持苹果bitcode,支持utf8等。出现问题因为是纯c代码,也好定位。比起luajit,lua对安装包的影响也更小。 而luajit胜在性能,如果其jit不出问题的话,可以比lua高一个数量级。目前luajit作者不打算维护luajit,在找人接替其维护,后续发展不太明朗。 项目可以根据自己情况判断哪个更适合。因为目前lua53版本使用较多,所以xLua工程Plugins目录下默认配套是lua53版本。 ## 更多示例 * [01_Helloworld](Assets/XLua/Examples/01_Helloworld/):

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值