天天看點

Unity3D 預備知識:C#與Lua互相調用

  在使用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目錄下。

    

Unity3D 預備知識:C#與Lua互相調用

(3)将ulua.dll(就是上面提到的C庫)放到Assets下的Plugins檔案夾中。(沒有Plugins檔案夾就建立一個)

(4)在Assets下的Script檔案夾中建立一個腳本CSharpLuaTest.cs,并将該腳本綁定到Main Camera上。

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

(6)在Assets下的StreamingAssets檔案夾中建立一個Lua腳本檔案Test.lua,打開Test.lua檔案,并編輯如下内容:

(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)。