网上有很多解决异常: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);

    }
}

上面是两个_而不是一个_

希望本文章对你有帮助。

posted on 2020-06-03 17:16  不希望有明天  阅读(3794)  评论(0编辑  收藏  举报