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