最近需要了解下Unity下使用lua的一些性能消耗,同事已经对这方面有所研究,然后我们自己也需要先了解一下,鉴于对SLua的不熟,所以还是先了解一下SLua,大体先看了下SLua的源码,然而不太会用,就又网上搜索了下SLua的使用,那先来个传送门吧//www.greatytc.com/p/2dc2b816f1a4。就一步一步的照着这哥的步骤来弄,期间遇到的一些坑,或者说是自己不了解的问题记录如下:
一、打开unity工程之后报错,无非就是一些C#的报错如下Assets/Slua/example/test/App.cs(16,29): error CS0117: `System.IO.File' does not contain a definition for `ReadAllBytes'本人也是C#的菜鸟,没有正统的学习过C#,原因很简单,切换下平台吧,切换到PC,或者Android平台即可
二、对于自定义C#对象在Lua中的使用问题,原因可能是我使用的版本和上述作者版本不一样吧,我的是最新的1.2.0版。如果lua中需要获取返回值并且返回值可用,那么C#函数的返回值则必须是>=2,不然其返回值就是nil了,以以下函数为例
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
[StaticExport]
public static int CreateHuMan(IntPtr L)
{
LuaObject.pushValue(L, true);//这行代码必不可少 参考了下SLua中example下的Test
CHuMan item = new CHuMan();
LuaObject.pushObject(L, item);
return 2;
}
以下是lua代码
function testHuman()
local human = CHuMan.CreateHuMan()
human.Age = 99
human.Name = "哈哈我长命快百岁了"
print(human.Age,human.Name)
end
同事因为用到了自定义的C#对象,所以我们需要初始化LuaState状态机与C#的转换对象而老版本的BindCustom.Bind (L);已经不存在了替而代之的是接口BindCustom.GetBindList()因此我们需要如此执行代码
var list = BindCustom.GetBindList();
foreach (Actioni in list)
{
i.Invoke(ls.handle);
}
执行完上述代码后,我们就可以安然无恙的执行我们的lua代码啦,
LuaFunction testHuman = ls.getFunction("testHuman");
testHuman.call();
没用过简书,不会插入代码(V^V).