1.對映到普通class或struct
定義乙個class,有對應於table的字段的public屬性,而且有無引數建構函式即可,比如對於可以定義乙個包含public int f1;public int f2;的class。在lua中這種方式下xlua會幫你new乙個例項,並把對應的字段賦值過去。
table的屬性可以多於或者少於class的屬性。可以巢狀其它複雜型別。
要注意的是,這個過程是值拷貝,如果class比較複雜代價會比較大。而且修改class的字段值不會同步到table,反過來也不會。
這個功能可以通過把型別加到gcoptimize生成降低開銷。
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...