XLua學習 C 訪問Lua 變數,表,函式

2021-09-06 22:09:27 字數 3051 閱讀 3423

首先通過luaenv.dostring()獲取到lua中的內容。然後通過luaenv.global.get方法可以對其中的屬性進行獲取。

luaenv env=new luaenv();

env.dostring("require 'csharpcalllua' ");//lua檔名

1.獲取全域性變數的基本屬性型別

例:lua指令碼

level=1

name="susu"

isboy=true

c#指令碼

int _level=env.global.get("level");

string _name= env.global.get("name");

bool _isboy = env.global.get("isboy");

此處型別必須對應,如果lua中level的值為1.01,而還是通過get去獲取,就會導致獲取不到。

2.訪問乙個全域性的table

例:lua指令碼

person=

function person.add(self,num1,num2)

print(num1+num2)

endfunction person:compare(num3,num4)

if(num3>num4) then

print(num3)

else

print(num4)

endend

function person.return(self,num1,num2)

return 12

end

2.1對映到普通class或struct例:c#指令碼

class person

struct mystruct

person p= env.global.get("person");

mystruct p1 = env.global.get("person");

直接複製xlua文件中的原話:

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

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

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

也就是說,這種方式消耗較大,而且你比如生成的p.name="new name",並不會改變lua中table的屬性,同樣你改變lua中person中name的值,不能改變p中的值。說白了相當於複製了乙份(new),和之前的已經沒有任何關係。而且,類的方式似乎無法對映表中的函式。

2.2對映到inte***ce

例:c#指令碼

[csharpcalllua]

public inte***ce iperson

int age

void eat();

void add(int a, int b);

void compare(int a, int b);

int return(int a, int b);

}iperson person= env.global.get("person");

person.age = 11;

env.dostring("print(person.age)");

person.eat();

person.add(1,2);

person.compare(4,5);

int num = person.return(1, 2);

debug.log(num);

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

和通過class對映不同點在於,介面的使用會直接改變table中的值。並且需要在界面前加上[csharpcalllua]。而且還可以直接對映函式。

這裡一定要注意的一點是lua指令碼中方法引數的問題。c#中person.add(1,2),可以對應lua中的三種寫法:

寫法一:

person=例c#指令碼:

dictionarymydictionary = 

env.global.get>("person");

foreach (var o in mydictionary)

listmylist = env.global.get>("person");

for (int i = 0; i < mylist.count; i++)

列印出來的結果,是通過dictionary方式,可以獲取到所有帶鍵值(key)的變數,包括函式。而後面字串,數值那些不會被對映過來。看log:

而通過list方式,後面不帶key值的都可以被對映過來,但前面帶鍵值的不會被對映。看log:

2.4對映到luatable

直接使用xlua自帶的luatable去做對映。不過似乎。。。。不怎麼好用。需要挨個兒去獲取。看它教程給出的:

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

luatable table = env.global.get("person");

debug.log(table.get("age"));

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

XLua官方教程 02 C 訪問Lua

這裡指的是c 主動發起對lua資料結構的訪問。本章涉及到的例子都可以在xlua tutorial csharpcalllua下找到。一 獲取乙個全域性基本資料型別 訪問luaenv.global就可以了,上面有個模版get方法,可指定返回的型別。luaenv.global.get int a lua...

XLua框架學習(三)C 訪問Lua中的全域性函式

function add print add endusing xlua luaenv luaenv newluaenv luaenv.dostring require csharpcalllua 需要先將lua指令碼載入進來 action add1 luaenv.global.get action...