天天看點

[Unity XLua]熱更新XLua入門(一)-基礎篇Aladdin_XLua

前段時間騰訊開源了一個内部熱更架構XLua在Unity開發群裡引起一陣熱議,也受到廣大開發者的熱捧,然後我當然也抱着好奇的心去學習學習。後面也會将擴充之後的工程放在git上,大家一起學習交流!在此感謝XLua作者創造出這麼好用的架構!

<a href="Unity3D%E7%83%AD%E6%9B%B4%E6%96%B0LuaFramework%E5%85%A5%E9%97%A8%E5%AE%9E%E6%88%98" target="_blank">XLua源碼</a>

<a href="https://github.com/yanghuan/bridge.lua" target="_blank">C#-&gt;Lua開源工具</a>

可以将C#轉化成lua并且具有

<a href="http://gad.qq.com/article/detail/7182056" target="_blank">相關介紹文章</a>

<a href="https://www.oschina.net/news/80638/c-net-lua-unity3d" target="_blank">https://www.oschina.net/news/80638/c-net-lua-unity3d</a>

<a href="https://www.zhihu.com/question/54344452/answer/139413144?group_id=800755990562734080" target="_blank">知乎熱議</a>

簡潔易用,容易上手

可擴充性高,添加自定義的CS子產品或者第三方插件非常友善

大廠維護,可靠

特色:HotFix

關于這個HotFix是其他熱更lua架構所不具備的,也是他最大的優勢和特色之一,原理就是通過特性标記然後在IL邏輯層判斷修改邏輯,使程式支援熱更的lua邏輯代碼而不是走之前的C#邏輯

現在開源熱更Lua架構都很少支援NGUI了,可能現在趨勢都是用原生的UGUI,但估計還有一些NGUI粉喜歡用NGUI開發,畢竟NGUI用了很長時間,XLua例子裡面已經支援了lua使用UGUI,這裡我就自己補充讓它支援NGUI開發。後續我也會多添加一些UGUI的例子。先看看擴充的NGUI做的界面效果圖,然後下面再講解怎麼讓XLua支援第三方插件。

[Unity XLua]熱更新XLua入門(一)-基礎篇Aladdin_XLua

在學習一個東西之前最好先學習一下XLua作者辛辛苦苦寫的那些多教程文檔,包括案例以及wiki和issu,如果還有什麼不明白的地方可以在加入文章最後的群我們一起交流學習。

這裡可以學習一下作者寫的Test中的例子,還是比較詳細,但我還是想記錄一下我自己嘗試的過程。

XLua支援使用特性标簽讓自定義的類可供Lua通路

C#:

添加上特性标簽之後,程式在啟動的會自動查找具有特性标記的類然後搜集進入lua棧,使得我們可以用Lua通路自定義的C#類和方法。

Lua通路:

如果是我們自己寫的C#代碼,我們可以通過第一種方式添加特性來讓Lua支援也是比較友善,如果是用的開源第三方插件,我們如何快速的讓XLua支援,就可以用過Generate Wrap的方式,這一點也是其他lua架構所采取的政策。

a)有命名空間的類

Lua:

luaModel是C#類,下面luaObj是類生成的對象,最後是通路對象方法,關于Lua冒号調用和點調用的差別:冒号調用預設傳入了self參數,不清楚的可以百度相關文章。

b)無命名空間的類

如果沒有命名空間的話直接CS後面就是類名,其實CS也是一個更外面一層的命名空間,隻不過是作者幫我們分裝的。

3)委托類型

委托其實也是跟Class平級的,委托也是一種類型,是以我們也需要對它像對待類那樣處理,通過添加特性标記或者通過Wrap方式處理,這裡委托是放在類裡面,其實也可以直接放在命名空間下面,.NET庫是這樣操作的,但我們看NGUI源碼會發現,NGUI源碼都是這樣操作的,比如按鈕的onClick事件,看它的委托類型VoidDelegate就會發現也是這樣操作的,是以我這裡例子也放在類的裡面。

C#

Lua:

4)帶有ref out 參數的函數如何處理

因為Lua是弱類型沒有C#那麼多類型,有時候一些參數可能就不太好處理,比如C#的不同類型參數的重載,lua就不太好處理,這裡可以檢視XLua中的issues,作者有一個問題的相關解答。下面我舉例ref和out參數類型的函數Lua如何通路。

C#:

一開始我測試的時候是本以為lua調用ref傳入的參數,也會傳回出修改的結果,但出乎我的意料,并沒能修改,經過作者提示,lua是通過傳回值傳回的ref參數,如果函數本身就有傳回值,那麼最後一個參數是傳回的ref或者out參數,這個讀者可以嘗試一下。

運作結果

[Unity XLua]熱更新XLua入門(一)-基礎篇Aladdin_XLua

關于Wrap

Wrap是C#跟Lua之間的一個橋梁,Lua想要通路C#必須要用過Wrap通路,相信看過其他Lua架構的這一點應該不陌生,XLua對生成Wrap也是非常友善。

我們隻要建立一個類然後繼承一個GenConfig的接口,下面是接口内容,關于這幾個類型XLua文檔中也有介紹,我們隻需要把自定義的類添加到LuaCallCSharp集合中即可,然後點選Generate就會自動幫我們生成對應的Wrap檔案

當然作者也說了,我們自定的C#代碼最好不要通過這種方式,我這裡隻是示範如何添加,下面會說第三方插件通過這話總方式支援。

正如上圖所示的效果,下面講述一下我是如何支援NGUI擴充的,也參考了作者UGUI的一個例子修改的。

這一步上上面說的一樣,隻要把NGUI的元件類全部都添加到LuaCallCSharp清單中然後Generate一下即可,這裡要注意的是元件中委托類型也需要添加進去。

[Unity XLua]熱更新XLua入門(一)-基礎篇Aladdin_XLua
[Unity XLua]熱更新XLua入門(一)-基礎篇Aladdin_XLua

購買

Panel邏輯:

lua檔案放在對應的Resources下即可

async_buy.lua

message_panel.lua

運作的結果就如第一張圖所示

添加資源熱更

添加一個小遊戲Demo

添加UGUI的案例

1.unity遊戲開發群

[Unity XLua]熱更新XLua入門(一)-基礎篇Aladdin_XLua
[Unity XLua]熱更新XLua入門(一)-基礎篇Aladdin_XLua

2.專門探讨XLua的程式群:437645698

<a href="https://git.oschina.net/dingxiaowei/Aladdin_XLua.git" target="_blank">https://git.oschina.net/dingxiaowei/Aladdin_XLua.git</a>

關注後續更新請點start或者fork,感謝!