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...