關於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);

    }
}

上面是兩個_而不是一個_

希望本文章對你有幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM