熱更新(二)-之Lua和.Net互相調(diào)用

什么是LuaInterface

LuaInterface包括兩個核心庫一個是LuaInterface.dll,一個是Luanet.dll击吱,我們可以通過LuaInterface完成Lua和C#(CLR)之間的互相調(diào)用

1环壤,在C#中執(zhí)行訪問Lua代碼

Paste_Image.png
Paste_Image.png

Lua lua = new Lua(); //創(chuàng)建Lua解析器
lua["num"]=2; //定義一個num
lua["str"]="a string"; //定義一個字符串
lua.newTable("tab"); //創(chuàng)建一個表 tab={}


Paste_Image.png

2锅减,取得lua環(huán)境中的變量

double num = (double)lua["num"];
string str = (string)lua["str"];

3篡殷,在C#中執(zhí)行Lua腳本文件,或者腳本字符串

lua.DoFile(“script.lua”);//執(zhí)行script.lua文件
lua.DoString("num=2");//執(zhí)行l(wèi)ua腳本
lua.DoString("str='a string'");
object[] retVals = lua.DoString("return num,str");//返回?cái)?shù)字和字符串
在熱更新中,只需要寫好解析lua腳本的代碼突诬,然后c#代碼不需要變動颂龙,只需要修改lua腳本就好,通過lua腳本控制游戲邏輯鳍咱。

Paste_Image.png

如果調(diào)試出錯誤降盹,先查看Lua中編碼器中格式是以ANSI格式編碼的。然后再查看如下:


Paste_Image.png

執(zhí)行MyLua.lua文件,先用Lua寫一個腳本谤辜,然后此腳本在luaInterface工程中


Paste_Image.png

4蓄坏,lua和C#中類型的對應(yīng)

nil         null

string      System.String

number      System.Double

boolean         System.Boolean

table       LuaInterface.LuaTable

function        LuaInterface.LuaFunction

5仅胞,把一個C#方法注冊進(jìn)Lua的一個全局方法(C#中操作)

//把一個類中的普通方法注冊進(jìn)去
lua.RegisterFunction("NormalMethod",obj,obj.GetType().GetMethod("NormalMethod"))
lua.DoString(" NormalMethod()");

//把一個類的靜態(tài)方法注冊進(jìn)去
lua.RegisterFunction("StaticMethod",null,typeof(ClassName).GetMethod("StaticMethod"))
lua.DoString(" StaticMethod()")

Paste_Image.png
Paste_Image.png

6,在Lua中使用c#中的類

require “l(fā)uanet“//引入庫
--加載CLR的類型剑辫、實(shí)例化CLR對象
luanet.load_assembly(“System.Windows.Forms”)//加載C#里面的DLL(命名空間)
luanet.load_assembly("System.Drawing")
Form = luanet.import_type("System.Windows.Forms.Form")
StartPosition = luanet.import_type(“System.Windows.Forms.FormStartPosition”)//引入類型
(命名空間里面的類)
print(Form)
print(StartPosition)
在Lua中使用C#中的類創(chuàng)建對象的時(shí)候干旧,會自動匹配最合適的構(gòu)造方法


Paste_Image.png

7-01,在Lua中訪問C#中的屬性和方法

Lua代碼中妹蔽,訪問C#對象的屬性的方式和訪問table的鍵索引一樣椎眯,比如obj.name 或者 obj["name"]

Lua代碼中,訪問C#對象的普通函數(shù)的方式和調(diào)用table的函數(shù)一樣胳岂,比如obj:method1()

Paste_Image.png

7-02编整,在Lua中訪問C#中的方法-特殊情況

當(dāng)函數(shù)中有out或ref參數(shù)時(shí),out參數(shù)和ref參數(shù)和函數(shù)的返回值一起返回乳丰,并且調(diào)用的時(shí)候掌测,out參數(shù)不需要傳入

C#函數(shù)定義
class Obj{
int OutMethod1(int parameter1,out parameter2,out parameter3){
parameter2=34;parameter3=213;
return parameter1;
}
int OutMethod2(int parameter1,ref parameter2){
parameter2=parameter2+2;
return parameter1+parameter2;
}
}

Lua中的調(diào)用和返回值
obj:OutMethod1(34)
--out參數(shù)不需要參數(shù),這個返回一個table产园,里面的值為parameter1,parameter2,parameter3
(34,34,213)

obj:OutMethod2(10,10)
--ref參數(shù)需要傳入汞斧,返回一個table有兩個值(value1,value2)


Paste_Image.png
當(dāng)有重載函數(shù)的時(shí)候,調(diào)用函數(shù)會自動匹配第一個能匹配的函數(shù)

可以使用get_method_bysig函數(shù)得到C#中指定類的指定參數(shù)的函數(shù)用法
luaMethod = get_method_bysig(Obj,"CSharpMethod","System.String")
luaMethod("siki")

8什燕,在Lua中注冊C#中的事件委托

在Lua中通過Add方法或者Remove方法把一個Lua的函數(shù)注冊或者注銷從C#中的事件委托中

    function method()

    end

    obj.SomeEvent:Add(methodname(不用帶引號))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粘勒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子屎即,更是在濱河造成了極大的恐慌庙睡,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技俐,死亡現(xiàn)場離奇詭異乘陪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)雕擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門啡邑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捂刺,你說我怎么就攤上這事谣拣∧颊” “怎么了族展?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拔鹰。 經(jīng)常有香客問我仪缸,道長,這世上最難降的妖魔是什么列肢? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任恰画,我火速辦了婚禮宾茂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拴还。我一直安慰自己跨晴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布片林。 她就那樣靜靜地躺著端盆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪费封。 梳的紋絲不亂的頭發(fā)上焕妙,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音弓摘,去河邊找鬼焚鹊。 笑死,一個胖子當(dāng)著我的面吹牛韧献,可吹牛的內(nèi)容都是我干的末患。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锤窑,長吁一口氣:“原來是場噩夢啊……” “哼阻塑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起果复,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤陈莽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后虽抄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體走搁,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年迈窟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了私植。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡车酣,死狀恐怖曲稼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情湖员,我是刑警寧澤贫悄,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站娘摔,受9級特大地震影響窄坦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一鸭津、第九天 我趴在偏房一處隱蔽的房頂上張望彤侍。 院中可真熱鬧,春花似錦逆趋、人聲如沸盏阶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽般哼。三九已至,卻和暖如春惠窄,著一層夾襖步出監(jiān)牢的瞬間蒸眠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工杆融, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留楞卡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓脾歇,卻偏偏與公主長得像蒋腮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子藕各,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • lua作為小巧精悍的腳本語言池摧,易于嵌入c/c++中 , 廣泛應(yīng)用于游戲AI 激况,實(shí)際上在任何經(jīng)常變化的邏輯上都可以使...
    木易林1閱讀 1,503評論 0 4
  • 指令集 lua_capture_error_log lua_use_default_type lua_malloc...
    吃瓜的東閱讀 11,999評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法作彤,類相關(guān)的語法,內(nèi)部類的語法乌逐,繼承相關(guān)的語法竭讳,異常的語法,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 主人找保姆浙踢,居然開出一天303元的高價(jià)工資绢慢。 這里到底有什么名堂? 邵浦在人才市場轉(zhuǎn)了一天洛波,簡歷送出去好幾十份胰舆,卻...
    學(xué)子之家閱讀 221評論 0 0
  • 2016年3月24日,我失戀了蹬挤。我可以確定的是缚窿,我還愛他,我也確定他還愛我闻伶,但是我是那么的驕傲滨攻,他是那么的固執(zhí)够话,兩...
    風(fēng)雨歸來是瀟瀟閱讀 302評論 0 0