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