騰訊開源手遊熱更新方案Xlua嚐鮮(四)——Lua呼叫C#
new C#物件
你在C#這樣new一個物件:
var newGameObj = new UnityEngine.GameObject();
對應到Lua是這樣:
local newGameObj =CS.UnityEngine.GameObject()
基本類似,除了:
1、lua裡頭沒有new關鍵字;
2、所有C#相關的都放到CS下,包括建構函式,靜態成員屬性、方法;
如果有多個建構函式呢?放心,xlua支援過載,比如你要呼叫GameObject的帶一個string引數的建構函式,這麼寫:
local newGameObj2 =CS.UnityEngine.GameObject('helloworld')
訪問C#靜態屬性,方法
讀靜態屬性
CS.UnityEngine.Time.deltaTime
寫靜態屬性
CS.UnityEngine.Time.timeScale= 0.5
呼叫靜態方法
CS.UnityEngine.GameObject.Find('helloworld')
小技巧:如果需要經常訪問的類,可以先用區域性變數引用後訪問,除了減少敲程式碼的時間,還能提高效能:
local GameObject =CS.UnityEngine.GameObject
GameObject.Find('helloworld')
訪問C#成員屬性,方法
讀成員屬性
testobj.DMF
寫成員屬性
testobj.DMF = 1024
呼叫成員方法
注意:呼叫成員方法,第一個引數需要傳該物件,建議用冒號語法糖,如下
testobj:DMFunc()
父類屬性,方法
xlua支援(通過派生類)訪問基類的靜態屬性,靜態方法,(通過派生類例項)訪問基類的成員屬性,成員方法
引數的輸入輸出屬性(out,ref)
Lua呼叫測的引數處理規則:C#的普通引數算一個輸入形參,ref修飾的算一個輸入形參,out不算,然後從左往右對應lua 呼叫測的實參列表;
Lua呼叫測的返回值處理規則:C#函式的返回值(如果有的話)算一個返回值,out算一個返回值,ref算一個返回值,然後從左往右對應lua的多返回值。
過載方法
直接通過不同的引數型別進行過載函式的訪問,例如:
testobj:TestFunc(100)
testobj:TestFunc('hello'
將分別訪問整數引數的TestFunc和字串引數的TestFunc。
注意:xlua只一定程度上支援過載函式的呼叫,因為lua的型別遠遠不如C#豐富,存在一對多的情況,比如C#的int,float,double都對應於lua的number,上面的例子中TestFunc如果有這些過載引數,第一行將無法區分開來,只能呼叫到其中一個(生成程式碼中排前面的那個)
操作符
支援的操作符有:+,-,*,/,==,一元-,<,<=, %,[]
引數帶預設值的方法
和C#呼叫有預設值引數的函式一樣,如果所給的實參少於形參,則會用預設值補上。
可變引數方法
對於C#的如下方法:
void VariableParamsFunc(int a, params string[] strs)
可以在lua裡頭這樣呼叫:
testobj:VariableParamsFunc(5,'hello', 'john')
使用Extension methods
在C#裡定義了,lua裡就能直接使用。
泛化(模版)方法
不直接支援,可以通過Extension methods功能進行封裝後呼叫。
列舉型別
列舉值就像列舉型別下的靜態屬性一樣。
testobj:EnumTestFunc(CS.Tutorial.TestEnum.E1)
上面的EnumTestFunc函式引數是Tutorial.TestEnum型別的
另外,如果列舉類加入到生成程式碼的話,列舉類將支援__CastFrom方法,可以實現從一個整數或者字串到列舉值的轉換,例如:
CS.Tutorial.TestEnum.__CastFrom(1)
CS.Tutorial.TestEnum.__CastFrom('E1')
delegate使用(呼叫,+,-)
C#的delegate呼叫:和呼叫普通lua函式一樣
+操作符:對應C#的+操作符,把兩個呼叫串成一個呼叫鏈,右運算元可以是同類型的C# delegate或者是lua函式。
-操作符:和+相反,把一個delegate從呼叫鏈中移除。
Ps:delegate屬性可以用一個luafunction來賦值。
event
比如testobj裡頭有個事件定義是這樣:
public event Action TestEvent;
增加事件回撥
testobj:TestEvent('+',lua_event_callback)
移除事件回撥
testobj:TestEvent('-',lua_event_callback)
64位整數支援
Lua53版本64位整數(long,ulong)對映到原生的64未整數,而luaji版本t,相當於lua5.1的標準,本身不支援64位,xlua做了個64位支援的擴充套件庫,C#的long和ulong都將對映到userdata:
1、支援在lua裡頭進行64位的運算,比較,列印
2、支援和lua number的運算,比較
3、要注意的是,在64擴充套件庫中,實際上只有int64,ulong也會先強轉成long再傳遞到lua,而對ulong的一些運算,比較,我們採取和java一樣的支援方式,提供一組API,詳情請看API文件。
C#複雜型別和table的自動轉換
對於一個有無參建構函式的C#複雜型別,在lua側可以直接用一個table來代替,該table對應複雜型別的public欄位有相應欄位即可,支援函式引數傳遞,屬性賦值等,例如:
C#下B結構體(class也支援)定義如下:
public struct A
{
public int a;
}
public struct B
{
public A b;
public double c;
}
某個類有成員函式如下:
void Foo(B b)
在lua可以這麼呼叫
obj:Foo({b = {a =100}, c = 200})
獲取型別(相當於C#的typeof)
比如要獲取UnityEngine.ParticleSystem類的Type資訊,可以這樣
typeof(CS.UnityEngine.ParticleSystem)
“強”轉
lua沒型別,所以不會有強型別語言的“強轉”,但有個有點像的東西:告訴xlua要用指定的生成程式碼去呼叫一個物件,這在什麼情況下能用到呢?有的時候第三方庫對外暴露的是一個interface或者抽象類,實現類是隱藏的,這樣我們無法對實現類進行程式碼生成。該實現類將會被xlua識別為未生成程式碼而用反射來訪問,如果這個呼叫是很頻繁的話還是很影響效能的,這時我們就可以把這個interface或者抽象類加到生成程式碼,然後指定用該生成程式碼來訪問:
cast(calc, typeof(CS.Tutorial.Calc))
上面就是指定用CS.Tutorial.Calc的生成程式碼來訪問calc物件。
相關推薦
騰訊開源手遊熱更新方案Xlua嚐鮮(四)——Lua呼叫C#
new C#物件 你在C#這樣new一個物件: var newGameObj = new UnityEngine.GameObject(); 對應到Lua是這樣: local newGameObj =CS.UnityEngine.GameObject() 基本類似,除了:
騰訊開源手遊熱更新方案Xlua嚐鮮(三)——C#訪問Lua
C#訪問Lua 這裡指的是C#主動發起對Lua資料結構的訪問。 一、獲取一個全域性基本資料型別 訪問LuaEnv.Global就可以了,上面有個模版Get方法,可指定返回的型別。 luaenv.Global.Get<int>("a"); luaenv.Globa
騰訊開源手遊熱更新方案,Unity3D下的Lua程式設計
xLua是Unity3D下Lua程式設計解決方案,自2016年初推廣以來,已經應用於十多款騰訊自研遊戲,因其良好效能、易用性、擴充套件性而廣受好評。現在 騰訊已經將xLua開源到GitHub。 2016年12月末,xLua剛剛實現新的突破:全平臺支援用Lua修復C#程式碼bug。 目前Unity下的Lua熱
手遊熱更新方案--Unity3D下的CsToLua技術
con 我們 如何 研發 效率 並且 dll文件 play 表示 WeTest 導讀 CsToLua工具將客戶端 C#源碼自動轉換為Lua,實現熱更新,本文以麻將項目為例介紹客戶端技術細節。 麻將項目架構 其中ChinaMahjong-CSLua為C#工
xLua 2.1.13 釋出,騰訊開源的手遊熱更新解決方案
新增特性 新增AdaptByDelegate注入模式; 新增xlua.get_generic_method,用於呼叫泛型函式; 支援類似CS.System.Collections.Generic.List(CS.System.Int32)的泛型寫法; 注入新選項
騰訊RPG手遊代號:夏娃(龍族幻想)DNA首測,這遊戲畫風也太美了吧
龍族幻想手遊什麼時候上線(之前叫代號:夏娃,現在已經更名為龍族幻想)?等了這麼久,騰訊今年代理髮行的全新次世代RPG手遊大作終於迎來首次DNA限量測試: 測試玩家招募時間從12.12-12.25日,測試時間為12.26-12.28,想要
【騰訊開源】iOS爆記憶體問題解決方案-OOMDetector元件
元件介紹 OOMDetector是手Q自研的IOS記憶體監控元件,騰訊內部目前已有多個App接入了OOMDetector,它主要有以下兩個功能: 爆記憶體堆疊統計:負責記錄程序記憶體分配堆疊和記憶體塊大小,在爆記憶體時Dump堆疊資料到磁碟 記憶體洩漏檢測
Unity3D熱更新方案網摘總結
xiang 分配 3.5 速度慢 for 小夥伴 source 為什麽 software 參考:http://blog.csdn.net/guofeng526/article/details/52662994 http://blog.csdn.net/u010019717/
資源 | 騰訊開源800萬中文詞的NLP資料集
本文經AI新媒體量子位(公眾號ID:qbitai)授權轉載,轉載請聯絡出處。 本文約1200字,建議閱讀6分鐘。 本文為你介紹鵝廠近期正式開源的一個大規模、高質量的中文詞向量資料集。 鵝廠開源,+1 again~ 又一來自騰訊AI實驗室的資源帖。
Blade - 騰訊開源的構建系統 c/c++編譯環境
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
騰訊牽手羅氏,進軍腫瘤界仍然還差臨門一腳
文 |易敏 來源 | 智慧相對論(ID:aixdlun) 一直很好奇當網際網路大佬和醫藥界巨頭牽手,會擦出怎樣的火花。 近日擁有著10億社交使用者的騰訊就和擁有10億患者的羅氏製藥就進行了一次網際網路+傳統醫療的碰撞。據澎湃新聞
Omi 5.0.5 釋出,騰訊開源的下一代 Web 框架
Omi 5.0.5 已釋出,更新內容如下: [Fix] fix host [Add] supports defineElement for amd env, it's the same as define Omi 是騰訊開源的下一代 Web 框架,去萬物糟粕,合精
提供在Linux上執行最新版騰訊QQ與TIM的解決方案 Easiest Way to Run QQ&TIM on Linux
最近使用Ubuntu16.04 LTS作業系統,安裝QQ發現真的頭疼。軟體商店安裝的qq國際版版本太低不支援登入,crossover安裝賊麻煩,於是乎發現了這個連結: https://github.com/askme765cs/Wine-QQ-TIM 亦或者到百度雲下載: 連結:http
騰訊視訊 去廣告去更新
騰訊視訊 騰訊視訊致力於打造中國領先的線上視訊媒體平臺,以豐富的內容、極致的觀看體驗、便捷的登入方式、24小時多平臺無縫應用體驗以及快捷分享的產品特性,主要 … 『軟體推薦』騰訊視訊 V6.2.5
騰訊開源的Paxos庫PhxPaxos程式碼解讀---Prepare階段(一)
簡單的畫了一下PhxPaxos在Prepare階段的邏輯,主要是正常的邏輯,異常邏輯和超時後面再寫了; 熟悉PhxPaxos程式碼最好的方法是編譯執行sample目錄下的三個例子,編譯方法在另一篇部落格已經寫了,這裡忽略; 一: Proposor在Pre
深度揭祕騰訊DevOps全鏈路解決方案
引言:6月29日,DevOps國際峰會在北京盛大開幕。在騰訊DevOps專場,多位騰訊專家以騰訊工蜂, 騰訊Hub, 騰訊織雲等產品為例,分別從研發管理、持續整合、部署運維三個角度介紹了騰訊DevOps全鏈路解決方案,幫助大型企業DevOps在全鏈路上提升效率,創造更大價值
Android熱更新方案Robust
美團•大眾點評是中國最大的O2O交易平臺,目前已擁有近6億使用者,合作各類商戶達432萬,訂單峰值突破1150萬單。美團App是平臺主要的入口之一,O2O交易場景的複雜性決定了App穩定性要達到近乎苛刻的要求。使用者到店消費買優惠券時死活下不了單,定外賣一個明顯可用的紅包怎麼
騰訊MSDK手Q微信授權登入
其實MSDK WIKI講的很詳細,這裡就只挑重點了 名詞解釋 名稱 名詞概述 平臺 微信,手Q統稱平臺 openId 使用者授權後平臺返回的唯一標識 accessToken 使用者授權票據, 獲取此票據以後可以認為使用者已經授權, 分享/支付等功能需要
Unity3D 熱更新方案(集合各位專家的彙總)
一、什麼是熱更新? 熱更新,是對hot update或者hot fix的翻譯,計算機術語,表示在不停機的前提下對系統進行更改(摘抄一下): “hot就是熱,機器執行會發燙,hot就是不停機的意思。 熱更新,是個很形象的詞,機器燙的時候更新,開著更新。 比如Windows不重啟的前提下安裝補丁 比
移動端熱更新方案(iOS+Android)
一 、熱更新(熱修復)產品背景 這裡談到的熱更新都是指APP(不包含網頁)。APP按大類別可以粗略分為 應用 和 遊戲。 APP的開發週期是極其快速的,在實際開發流程中,我們總會有一些需求迫使我們短時間內快速上線,比如需求流程出錯,程式設計師主觀導致的一