网上有很多解决异常: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);
}
}
上面是两个_而不是一个_
希望本文章对你有帮助。