在使用Unity開發遊戲以支持熱更新的方案中,使用ULua是比較成熟的一種方案。那麼,在使用ULua以前,咱們必須先搞清楚,C#與Lua是怎樣交互的了?javascript
簡單地說,c#調用lua, 是c# 經過Pinvoke方式調用了lua的dll(一個C庫),而後這個dll執行了lua腳本。java
ULua = Lua + LuaJit(解析器、解釋器) +LuaInterface。c#
其中,LuaInterface中的核心就是C#經過Pinvoke對Lua C庫調用的封裝,因此,在Unity中,LuaInterface就是C#與Lua進行交互的接口。函數
下面咱們以一個簡單的例子來演示C#與Lua的相互調用。 this
以下是構建這個例子的步驟。lua
(1)下載ULua源碼。spa
(2)在Unity中新建一個項目,並將ULua源碼拷貝到Assets目錄下。code
(3)將ulua.dll(就是上面提到的C庫)放到Assets下的Plugins文件夾中。(沒有Plugins文件夾就新建一個)orm
(4)在Assets下的Script文件夾中新建一個腳本CSharpLuaTest.cs,並將該腳本綁定到Main Camera上。blog
(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)。