Xlua基礎 三 Lua呼叫C

2021-09-24 13:22:53 字數 3623 閱讀 8876

1.new c#物件

local newgameobj = cs.unityengine.gameobject()

local newgameobj2 = cs.unityengine.gameobject('helloworld')

print(newgameobj, newgameobj2)

2.訪問靜態屬性,方法

local gameobject = cs.unityengine.gameobject

print('unityengine.time.deltatime:', cs.unityengine.time.deltatime) --讀靜態屬性

cs.unityengine.time.timescale = 0.5 --寫靜態屬性

print('helloworld', gameobject.find('helloworld')) --靜態方法呼叫

3.訪問成員屬性,方法

local derivedclass = cs.tutorial.derivedclass

local testobj = derivedclass()--呼叫建構函式

testobj.dmf = 1024--設定成員屬性

print(testobj.dmf)--讀取成員屬性

testobj:dmfunc()--成員方法

4.過載方法的呼叫

testobj:testfunc(100)

testobj:testfunc('hello')

lua語言沒辦法區別單精度雙精度,所以假設擁有單雙精度的過載是按順序來呼叫,會呼叫最上面的那個過載方法。

5.可變引數方法呼叫

public void variableparamsfunc(int a, params string strs)

}---lua

testobj:variableparamsfunc(5, 'hello', 'john')

6.帶有結構體的引數的方法    

在lua端定義乙個表去對映結構體:

public struct mystruct

public void csharpfunc(mystruct p)

--lua

mystructtable=

obj:csharpfunc(mystructtable)

如果是帶有介面引數,則和上面相似,不過要在介面的定義上加上[csharpcalllua]來為介面生成例項**。具體使用是[csharpcalllua]還是[luacallcsharp]是看由哪方呼叫的。在這裡,如果方法寫在c#端,那麼肯定由c#端去執行這個介面的業務,也就是說是由c#來執行lua的table的業務,那麼實際上在方法的呼叫上是lua呼叫c# ,而方法內對介面內方法的呼叫就是csharpcalllua.

委託也是和介面一樣,打上[csharpcalllua]並且生成**,然後由lua端寫好function來傳入。

7.帶有多返回數值的c#方法

c#不是只有乙個返回值嗎?這裡還得算上帶有ref out的引數。 看個官方例子:

public double complexfunc(param1 p1, ref int p2, out string p3, action luafunc, out action csfunc)

,p2 = " + p2);

luafunc();

p2 = p2 * p1.x;

p3 = "hello " + p1.y;

csfunc = () =>

;return 1.23;

}--lua

local ret, p2, p3, csfunc = testobj:complexfunc(, 100, function()

print('i am lua callback')

end)

print('complexfunc ret:', ret, p2, p3, csfunc)

csfunc()

看起來很複雜,實際上很簡單,lua中呼叫這個方法,傳值的時候只傳了3個而實際上引數有5個,原因是帶out的引數不需要傳值。

8.lua中不支援c#的泛型方法,但可以使用擴充套件方法來呼叫

直接看官方例子:

public void genericmethod()

[luacallcsharp]

public static class derivedclas***tensions

public static int getsomebasedata(this baseclass obj)

public static void genericmethodofstring(this derivedclass obj)

}

print(testobj:getsomedata())

print(testobj:getsomebasedata()) --訪問基類的extension methods

testobj:genericmethodofstring() --通過extension methods實現訪問泛化方法

9.事件

public event action testevent;

--lua

local function lua_event_callback1() print('lua_event_callback1') end

local function lua_event_callback2() print('lua_event_callback2') end

testobj:testevent('+', lua_event_callback1)

testobj:callevent()

testobj:testevent('+', lua_event_callback2)

testobj:callevent()

testobj:testevent('-', lua_event_callback1)

testobj:callevent()

testobj:testevent('-', lua_event_callback2)

10.委託

public actiontestdelegate = (param) =>

;--lua

testobj.testdelegate('hello') --直接呼叫

local function lua_delegate(str)

print('testdelegate in lua:', str)

endtestobj.testdelegate = lua_delegate + testobj.testdelegate --combine,這裡演示的是c#delegate作為右值,左值也支援

testobj.testdelegate('hello')

testobj.testdelegate = testobj.testdelegate - lua_delegate --remove

testobj.testdelegate('hello')

Xlua基礎 二 C 呼叫Lua

1.呼叫lua的乙個全域性的變數 env new luaenv env.dostring require helloworld env.global.get str 很簡單,泛型型別裡寫變數的型別,引數傳變數名。2.訪問全域性table 1 將table對映到class 將lua table中的鍵名...

xLua學習總結(三) C 訪問lua中資料

1.將lua中基本資料對映到c 型別 lua中資料 a 1 str 小明 檔案編碼改為utf 8 isright true c int a env.global.get a string str env.global.get str bool isright env.global.get isrig...

Lua與C 呼叫Lua函式(三)

lua允許在乙個文字中定義函式,並且可以通過c語言來呼叫這個函式。先將帶呼叫的函式壓棧,並壓入函式的引數。然後是用lua pcall進行實際呼叫。最後,將呼叫結果從戰中彈出。lua函式 function add x,y return x y end c language double add lua...