xLua C 訪問Lua之訪問Lua的table

2021-09-19 17:25:47 字數 3506 閱讀 8760

1.對映到普通class或struct

定義乙個class,有對應於table的字段的public屬性,而且有無引數建構函式即可,比如對於可以定義乙個包含public int f1;public int f2;的class。

這種方式下xlua會幫你new乙個例項,並把對應的字段賦值過去。

table的屬性可以多於或者少於class的屬性。可以巢狀其它複雜型別。

要注意的是,這個過程是值拷貝,如果class比較複雜代價會比較大。而且修改class的字段值不會同步到table,反過來也不會。

這個功能可以通過把型別加到gcoptimize生成降低開銷。

在lua中

person =
在c#中,新建person類,字段必須和lua的key相同才能獲取對應的值

public class person

person person = luaenv.global.get

("person");

print

(person.name +

","+ person.age)

;p.name =

"haha"

;//修改class的字段值不會同步到table,反過來也不會,值拷貝

修改class的字段值不會同步到table,反過來也不會

2.對映到乙個inte***ce

這種方式依賴於生成**(如果沒生成**會拋invalidcastexception異常),**生成器會生成這個inte***ce的例項,如果get乙個屬性,生成**會get對應的table欄位,如果set屬性也會設定對應的字段。甚至可以通過inte***ce的方法訪問lua的函式。

在lua中

i = 10.1

str = "wwz"

isstu = false

person =

[csharpcalllua]

inte***ce iperson

int age

void

eat(

int a,

int b)

;}

在unity 2018.3.0f2版本下出現錯誤,原來unity 2018 不支援xlua

本次用的是unity 2018.3.0f2和xlua_v2.1.14,由於相容性問題

【xlua】新增csharpcalllua還是報錯

最終,換成unity 2017.1.0f3 和xlua_v2.1.9

iperson p = luaenv.global.get

("person");

print

(p.name +

","+ p.age)

;p.name =

"haha"

;//修改inte***ce的字段值會同步到table

在lua中

可以這麼寫

function person:add(a,b)

print(a+b)

end

也可以這麼寫

function person.add(self,a,b)

print(a+b)

end

3.更輕量級的by value方式:對映到dictionary<>,list<>

不想定義class或者inte***ce的話,可以考慮用這個,前提table下key和value的型別都是一致的。

在lua中

person =
在c#中,

指定型別對映

list<

int> list = luaenv.global.get

int>>

("person");

foreach (

int o in list)

只對映int型別的

4.另外一種by ref方式:對映到luatable類

這種方式好處是不需要生成**,但也有一些問題,比如慢,比方式2要慢乙個數量級,比如沒有型別檢查。

luatable能對映所有型別,不用生成**,但效能低,不推薦使用

xLua C 訪問Lua之訪問Lua的變數

在resources資料夾中新建乙個csharpcalllua.lua.txt檔案,定義幾個變數 i 10 str wwz isstu false void start lua的number型別對於c 的int,float,double的,如果型別不對,會返回0比如在lua中i 10.1,c 中in...

xLua C 訪問lua中的全域性function

這種是建議的方式,效能好很多,而且型別安全。缺點是要生成 如果沒生成 會拋invalidcastexception異常 delegate要怎樣宣告呢?對於function的每個引數就宣告乙個輸入型別的引數。多返回值要怎麼處理?從左往右對映到c 的輸出引數,輸出引數包括返回值,out引數,ref引數。...

XLua C 訪問Lua中的table的幾種方式

c 訪問lua中的全域性變數 c luaenv new luaenv luaenv.dostring require csharpcalllua 獲取lua中的全域性變數 string name luaenv.global.get name print name name int hp luaenv...