1. 程式人生 > WINDOWS開發 >關於C#呼叫XLua的函式丟擲attempt to call a nil value (global 'print')

關於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",runTable); } }

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

希望本文章對你有幫助。