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

    

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM