這種是建議的方式,效能好很多,而且型別安全。缺點是要生成**(如果沒生成**會拋invalidcastexception異常)。
delegate要怎樣宣告呢?
對於function的每個引數就宣告乙個輸入型別的引數。
多返回值要怎麼處理?從左往右對映到c#的輸出引數,輸出引數包括返回值,out引數,ref引數。
引數、返回值型別支援哪些呢?都支援,各種複雜型別,out,ref修飾的,甚至可以返回另外乙個delegate。
delegate的使用就更簡單了,直接像個函式那樣用就可以了。
void
loadglobalfun1()
[
csharpcalllua
]public
delegate
void
fdelegate
(int a,
string b)
;void
loadglobalfun2()
public
class
dclass
[xlua.csharpcalllua
]public
delegate
intfdelegate2
(int a,
string b,
outdclass c)
;void
loadglobalfun3()
end
"; luaenv.
dostring
(script)
;fdelegate2 fun3 = luaenv.global.
get<
fdelegate2
>
("fun3");
dclass c;
debug.
log(
fun3(10
,"hh"
,out c));
}
[
csharpcalllua
]public
delegate
action
gete()
;void
loadglobalfun()
這種方式的優缺點剛好和第一種相反。
使用也簡單,luafunction上有個變參的call函式,可以傳任意型別,任意個數的引數,返回值是object的陣列,對應於lua的多返回值。
兩種過載方法:
object call(params object args) 描述:以可變引數呼叫lua函式,並返回該呼叫的返回值。
string script =
@" function fun(a,b)
return a+b,a-b
endend ";
luaenv.
dostring
(script)
;luafunction fun = luaenv.global.
get<
luafunction
>
("fun");
object
objs = fun.
call(5
,15);
foreach
(object obj in objs)
object call(object args, type returntypes) 描述:呼叫lua函式,並指明返回引數的型別,系統會自動按指定型別進行轉換
public
class
dclass
string script =
@" function fun(a, b)
print('a', a, 'b', b)
return 1,
end ";
luaenv luaenv =
newluaenv()
;luaenv.
dostring
(script)
;luafunction fun = luaenv.global.
get<
luafunction
>
("fun");
object
objs = fun.
call
(new
object
,new
type
);foreach
(object obj in objs)
debug.
log(objs[0]
);debug.
log(
(objs[1]
as dclass)
.f1)
;
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之訪問Lua的table
1.對映到普通class或struct 定義乙個class,有對應於table的字段的public屬性,而且有無引數建構函式即可,比如對於可以定義乙個包含public int f1 public int f2 的class。這種方式下xlua會幫你new乙個例項,並把對應的字段賦值過去。table的...
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...