关于C#调用XLua的函数抛出attempt to call a nil value (global 'print')
网上有很多解决异常:attempt to call a nil value (global 'print')的方法,但是我发现都是错误的。因为我试了好几个,然后最后才发现都是错误的。
说说我的解决方法吧。
抛出异常的代码如下:
public class LuaDemoScript : MonoBehaviour { public TextAsset textAsset; public CMyClass[] lists; private LuaTable runTable; internal static LuaEnv luaEnv = new LuaEnv(); public void Awake() { runTable = luaEnv.NewTable(); LuaTable metaTable = luaEnv.NewTable(); metaTable.Set("_index", luaEnv.Global); runTable.SetMetaTable(metaTable); metaTable.Dispose(); runTable.Set("self", this); for(int i = 0;i < lists.Length; i++) { runTable.Set(lists[i].name, lists[i].go); } luaEnv.DoString(textAsset.text,"LuaDemo.lua", runTable); } }
上面的代码看红色字体。它这里有点问题,原因是它的元方法没有_index方法
所以它会抛出很多异常。如果是有关attempt to call a nil value (global 'print')的异常,比如:attempt to call a nil value (global 'xxx')的话也可以使用这个方法
上面说到XLua是没有"_index"元方法,但是它有"__index"方法。
所以我们需要把上面的"_index"改为"__index"方法就可以了。
上面的代码改正如下:
public class LuaDemoScript : MonoBehaviour { public TextAsset textAsset; public CMyClass[] lists; private LuaTable runTable; internal static LuaEnv luaEnv = new LuaEnv(); public void Awake() { runTable = luaEnv.NewTable(); LuaTable metaTable = luaEnv.NewTable(); metaTable.Set("__index", luaEnv.Global); runTable.SetMetaTable(metaTable); metaTable.Dispose(); runTable.Set("self", this); for(int i = 0;i < lists.Length; i++) { runTable.Set(lists[i].name, lists[i].go); } luaEnv.DoString(textAsset.text,"LuaDemo.lua", runTable); } }
上面是两个_而不是一个_
希望本文章对你有帮助。