Unity3D 預備知識:C#與Lua相互呼叫

zhuweisky發表於2017-04-13

  在使用Unity開發遊戲以支援熱更新的方案中,使用ULua是比較成熟的一種方案。那麼,在使用ULua之前,我們必須先搞清楚,C#與Lua是怎樣互動的了?

一.基本原理

  簡單地說,c#呼叫lua, 是c# 通過Pinvoke方式呼叫了lua的dll(一個C庫),然後這個dll執行了lua指令碼。

       ULua = Lua + LuaJit(解析器、直譯器) +LuaInterface。

       其中,LuaInterface中的核心就是C#通過Pinvoke對Lua C庫呼叫的封裝,所以,在Unity中,LuaInterface就是C#與Lua進行互動的介面。

  下面我們以一個簡單的例子來演示C#與Lua的相互呼叫。 

二.入門例子

  如下是構建這個例子的步驟。

(1)下載ULua原始碼。

(2)在Unity中新建一個專案,並將ULua原始碼拷貝到Assets目錄下。

    

(3)將ulua.dll(就是上面提到的C庫)放到Assets下的Plugins資料夾中。(沒有Plugins資料夾就新建一個)

(4)在Assets下的Script資料夾中新建一個指令碼CSharpLuaTest.cs,並將該指令碼繫結到Main Camera上。

(5)在CSharpLuaTest.cs中編輯以下內容:

public class CSharpLuaTest : MonoBehaviour {

    private LuaState luaState = new LuaState(); // 建立lua虛擬機器 
   
    void Start ()
    {
        // 在lua虛擬機器(全域性)中註冊自定義函式
        this.luaState.RegisterFunction("CSharpMethod", this, this.GetType().GetMethod("CSharpMethod"));

        // 載入lua檔案(絕對路徑)  
        this.luaState.DoFile(Application.streamingAssetsPath + "/Test.lua");

        // 載入完檔案後,使用GetFunction獲取lua指令碼中的函式,再呼叫Call執行。  
        object[] objs = luaState.GetFunction("LuaMethod").Call(999);        
        Debug.Log(string.Format("{0} - {1}" ,objs[0], objs[1]));
    }

    //自定義功能函式,將被註冊到lua虛擬機器中  
    public string CSharpMethod(int num)   
    {
        return string.Format("Hello World {0} !" , num+1);
    }
   
    void Update () {    
    }
}

(6)Assets下的StreamingAssets資料夾中新建一個Lua指令碼檔案Test.lua,開啟Test.lua檔案,並編輯如下內容:

function LuaMethod(i)
s = CSharpMethod(i); --呼叫C#方法
return i,s;
end

(7)執行Unity專案,則可以看到輸出:999 - Hello World 1000 ! 

 三.要點說明

  最後簡單說一下上面程式碼的要點:

1.如果一個C#方法要被Lua呼叫,則首先要將其註冊到Lua虛擬機器中(LuaState.RegisterFunction)。之後,在Lua中就可以通過註冊的名稱來呼叫這個C#方法。

2.如果C#要呼叫Lua中的函式,則

(1)首先要在Lua虛擬機器中載入該函式(LuaState.DoFile)。

(2)拿到目標函式(LuaState.GetFunction)。  

(3)執行目標函式(LuaFunction.Call)。    

 

相關文章