天天看點

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中編輯以下内容:

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檔案,并編輯如下内容:

1 2 3 4

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

繼續閱讀