Skip to content
Yongkang Chen edited this page Aug 21, 2014 · 3 revisions

这里记录使用unity3d和lua相关的坑


1、绑定lua function报错

 local button = child("buttonName").gameObject; 
 UIEventListener.Get(button).onClick = OnClick; 

这个事件关联代码在iOS下是报错的,不能够正确执行(安卓没事)

感谢yongkangchen同学提示:ulua的README.txt里最后一段有说明。只要在CheckType.cs的第一行定义#define __NOGEN__,那么所有平台使用这种代码都会报错了。(如果要发布ios平台的话,建议定义上去,方便日常开发。)

感谢chiuan同学的下述代码贡献,通过Lua通知C#的添加方式,绕过了这个问题

public static void AddClick(GameObject go,object lua){ 
  UIEventListener.Get(go).onClick += delegate(GameObject o){ 
  LuaFunction func = (LuaFunction)lua; 
  func.Call(); 
  }; 
} 

2、中文编码问题 感谢cnlas同学的下述代码贡献(大前提是lua文件编码要存成UTF8):

Lua.cs Line159 
if (LuaDLL.luaL_loadbuffer(L, chunk, chunk.Length, name) != 0) 
改为 
if (LuaDLL.luaL_loadbuffer(L, chunk, System.Text.Encoding.UTF8.GetByteCount (chunk), name) != 0) 

Line 225 
if (LuaDLL.luaL_loadbuffer(L, chunk, chunk.Length, chunkName) == 0) 
改为 
if (LuaDLL.luaL_loadbuffer(L, chunk, System.Text.Encoding.UTF8.GetByteCount (chunk), chunkName) == 0) 

原因是对于中文等双字节字符,string.Length的返回值是把一个汉字当一个计数的,这样底层的库去parser时候就等于没读完整。


3、ulua(luainterface)对c#对象错误处理,导致不同对象,引用同一个对象的bug 感谢pangweiwei提出, yongkangchen补充:

local v1=Vector3(1,1,1) 
local v2=Vector3(1,1,1) 
v1.x = 100 
print(v1.x, v2.x) 

你会发现v2.x也变成100了。

原因: luainterface用dictionary存储的vector, 而dict是用的object.hashcode() 所有的c# object都是存储在dict里的,任何对象的hashcode一样,都可能导致obj是同一个,而Vector的hash实现刚好是用x,y,z的值来计算的。

可能解决方案,未验证: 参考这2个commit https://github.com/NLua/NLua/commit/81d6d81b901c1cb7cec52cf1d73a49c993a3abe6#commitcomment-7216098 https://github.com/NLua/NLua/commit/a679211b0965b565d6b07f1823141fc3dcdf4280#diff-a1af65e626ad314e476457fd5774054f


4、EntryPointNotFoundException: luaL_newstate 感谢isaachu同学找到问题所在:EntryPointNotFoundException: luaL_newstate这个错误是因为在如果在Unity中是设置了iPhone平台,但是uLua的代码没有排除Editor环境,DllImport错误造成的。


5、一个是DLL没有找到的问题(DllNotFoundException: ulua),目前得到的结论是,真机没有打包libulua.so进包导致,或者模拟器也有些设置不对。打包的时候把libulua.so打包进libs\armeabi-v7a


6、ios平台真机发布注意设置, 不然会提示找不到c#对象的属性

ApiCompatibility Level: .NET 2.0 Subset
Stripping Level: Disabled

Clone this wiki locally