在使用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)。