Xlua基礎 二 C 呼叫Lua

2021-09-24 12:53:30 字數 3405 閱讀 9425

1. 呼叫lua的乙個全域性的變數

_env = new luaenv();

_env.dostring("require helloworld");

_env.global.get("str");

很簡單,泛型型別裡寫變數的型別,引數傳變數名。

2.訪問全域性table

(1)將table對映到class 

將lua table中的鍵名與c#中的欄位名保持一致,並且都是為public。通過get介面將class的型別傳入,引數填table名,返回的物件便是table對映後的物件

--簡單表

gamelanguage=

public class language

_env = new luaenv();

_env.dostring("require helloworld");

language language = _env.global.get("gamelanguage");

注意:這裡將table對映到class的過程是值拷貝,如果模擬較複雜(其中有複雜型別)需要一層層的對映,代價比較大,比較耗效能。而且,因為是值拷貝所以當c#端的class和lua端的table中資料有變化時,另一邊不會有變化。 

(2)將table對映到inte***ce(推薦方式)

上面那個是值拷貝,而接下來這個對映到inte***ce就是乙個引用拷貝的過程。

--表

gamelanguage=

[csharpcalllua]

public inte***ce ilanguage

string str2

string str3

void testfunc(string param1,int param2);

}_env = new luaenv();

_env.dostring("require helloworld");

ilanguage language = _env.global.get("gamelanguage");

因為介面不包含字段,對映介面實際上是把鍵值都對映到屬性上,屬性本質上是方法嘛。注意這裡的inte***ce上加上了乙個[csharpcalllua]的標籤。有了這個標籤以後,我們使用選單欄上的generatecode就會發現在xlua目錄下多了個gen的目錄,下面你會找到命名為xluahelloworldilanguagebridge的乙個類,這個類的命名很明顯是用xlua加上lua指令碼名加上對映的介面類的名字去定義的。

打上這個標籤之後,xlua會為我們生成這個介面的例項(介面本身是依賴於實現類來生成物件的嘛),而這個物件裡就為我們做了相關引用拷貝的操作,當我們get乙個屬性,生成**會get對應的table欄位,如果set屬性也會設定對應的字段。甚至可以通過inte***ce的方法訪問lua的函式。

(3)更方便的,對映到dictionary<>,list<>

不想定義class和inte***ce的話,就用這個,但是無法對映複雜表。

_env.global.get> --鍵和值的型別要和簡單表一一對應

_env.global.get> --這種方法就只能對應lua裡邊陣列型的table,鍵值為數字索引

(4)  by ref引用拷貝  對映到luatable類

這個適合於表複雜 但是使用頻率比較低的情況。這種方式好處是不需要生成**,但也有一些問題,比如慢,比方式2要慢乙個數量級,比如沒有型別檢查。

_env = new luaenv();

_env.dostring("require helloworld");

language language = _env.global.get("gamelanguage");

luatable lt = _env.global.get("sampletable");

int age = lt.get("age");

string name = lt.get("name");

luafunction func = lt.get("samplefunction");

func.call();

3.訪問lua中的function

(1)對映到委託

action act1 =_luaenv.global.get("luafunc1")

action act2 =_luaenv.global.get("luafunc2")

action act3 =_luaenv.global.get>("luafunc3")

action act4 =_luaenv.global.get>("luafunc4")

注意:1.委託用完之後需要dispose,否則會報錯

2.對映到委託需要加標籤[csharpcalllua],假如是自定義的委託型別,可以在定義上面直接加標籤;而內建的比如action,func是屬於unity的api,這種就需要去配置檔案中加,配置檔案就在xlua/example/examplegenconfig.cs裡面加。貼一段官方的**:

//c#靜態呼叫lua的配置(包括事件的原型),僅可以配delegate,inte***ce

[csharpcalllua]

public static listcsharpcalllua = new list() ;

上面可以看到,它已經幫我們寫好了一部分型別,如果新加入如上述例子**中第3,4行裡的那種型別,就需要手動新增一下。

3.另外,lua函式多返回值的問題,可以看一段官方的demo:

fdelegate f = luaenv.global.get("f");

dclass d_ret;

int f_ret = f(100, "john", out d_ret);//lua的多返回值對映:從左往右對映到c#的輸出引數,輸出引數包括返回值,out引數,ref引數

debug.log("ret.d = , ret=" + f_ret);

其實從左往右對映到c# 這邊的返回值、ref out 的引數裡

(2)對映的luafunction

luafunction d_e = luaenv.global.get("e");

object objs = d_e.call();

[csharpcalllua]

總結一下:

1.當我們使用inte***ce來對映lua table時,需要加上此標籤為介面生成乙個例項**,它內部幫我們進行了by ref的引用拷貝的相關操作。

2.當我們使用委託來對映lua function時,需要加上此標籤,若是委託型別屬於內建api,則需要去配置檔案中新增。

Xlua基礎 三 Lua呼叫C

1.new c 物件 local newgameobj cs.unityengine.gameobject local newgameobj2 cs.unityengine.gameobject helloworld print newgameobj,newgameobj2 2.訪問靜態屬性,方法 ...

xlua學習之路(二)xlua基礎

1.執行字串 xlua.luaenv luaenv new xlua.luaenv luaenv.dostring cs.unityengine.debug.log hello world luaenv.dispose 1 dostring引數為string,可輸入任意合法的lua 本示例在lua裡...

XLua 在Lua中遍歷C 的Dictionary

前些日子在處理一段客戶端資料時遇到這樣乙個問題,嘗試了各種的迴圈遍歷,結果都是不行,後來發現這段資料是c 的dictionary。我們在lua中可以通過獲取迭代器的方式來遍歷c 的dictionary。廢話不多說,直接上 local playerinfo cs.sg.playerdata.insta...