首先通過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...