1. 程式人生 > >騰訊開源手遊熱更新方案Xlua嚐鮮(四)——Lua呼叫C#

騰訊開源手遊熱更新方案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穩定性要達到近乎苛刻的要求。使用者到店消費買優惠券時死活下不了單,定外賣一個明顯可用的紅包怎麼

MSDKQ微信授權登入

其實MSDK WIKI講的很詳細,這裡就只挑重點了 名詞解釋 名稱 名詞概述 平臺 微信,手Q統稱平臺 openId 使用者授權後平臺返回的唯一標識 accessToken 使用者授權票據, 獲取此票據以後可以認為使用者已經授權, 分享/支付等功能需要

Unity3D 更新方案集合各位專家的彙總

一、什麼是熱更新? 熱更新,是對hot update或者hot fix的翻譯,計算機術語,表示在不停機的前提下對系統進行更改(摘抄一下): “hot就是熱,機器執行會發燙,hot就是不停機的意思。 熱更新,是個很形象的詞,機器燙的時候更新,開著更新。 比如Windows不重啟的前提下安裝補丁 比

移動端更新方案iOS+Android

一 、熱更新(熱修復)產品背景 這裡談到的熱更新都是指APP(不包含網頁)。APP按大類別可以粗略分為 應用 和 遊戲。 APP的開發週期是極其快速的,在實際開發流程中,我們總會有一些需求迫使我們短時間內快速上線,比如需求流程出錯,程式設計師主觀導致的一