KSFramework知識
https://github.com/mr-kelly/KSFramework
KSFramework是一個整合KEngine、SLua和一些開發組件組成的全功能Unity 5開發框架,適合有一定規模的團隊使用。
熱重載是KSFramework的開發重點——在不重啟游戲的前提下,重載代碼、配置表可立刻看到修改效果,最大限度的提升開發、調試的速度,並且在運營階段方便的進行產品熱更新。
看看Demo!
雙擊打開Assets/Game.unity場景,點擊播放。
圖:開始Game.unity后的日志輸出
KSFramework做了這些事
這時候KSFramework的默認Demo開始,做了這些事情:
- 基礎模塊的啟動
- Lua模塊的啟動
- 嘗試讀取並打印Excel表格GameConfig.xlsx內容
- 加載UI界面Login
- 執行UI界面Login的Lua腳本
- Lua腳本綁定UI控件、設置UI控件
- Lua腳本讀取並打印Excel表格GameConfig.xlsx內容
囊括KSFramework核心模塊的使用
總而言之,這個Demo囊括了KSFramework中的幾個核心模塊的使用:
- KEngine中的Setting模塊的使用
- KEngine中的UI的資源加載
- SLua腳本引擎與UI的聯合
接下來,將模仿這個Demo,創建/加載一個新的UI界面、創建/讀取一個新的配置表格。
嘗試做一個公告界面Billboard
接下來,我們將創建一個UI公告牌(Billboard),使用Lua腳本,並從配置表讀取公告內容。
1. 創建UI資源
圖:創建New Scene
Create UI
圖:KEngine – UI - Create UI 創建UI布局
圖:點擊Create UI后,默認隨機名字,把UI名字修改為Billboard
圖:修改UI名字為Billboard,UI界面右邊帶有黃色UI標識
圖:編輯一下UI場景,一個背景Image,兩個Label
保存一下場景,保存到Assets/BundleEditing/UI/Billboard.unity
Export UI To Assetbundle
圖:導出 — 打包AssetBundle,快捷鍵Ctrl+Alt+E
2. 加載UI界面
好了,Billboard界面創建好了,也導出成了AssetBundle。
顯示UI面板(OpenWindow方式)
接下來,我們通過代碼打開界面。
代碼示例
編輯 Assets/Code/Game.cs
在 OnFinishInitModules 函數的末端,加上這樣的一句:
// 開始加載我們的公告界面! UIModule.Instance.OpenWindow("Billboard");
完成並保存。
運行效果
打開場景 Assets/Game.unity,點擊播放按鈕:
我們的UI通過AssetBundle打開了,彈出提示找不到UI Lua腳本,接下來我們創建Lua腳本吧
3. 創建Lua腳本
圖:在目錄 Product/Lua/UI 中新建一個 lua文件
Lua腳本示例
寫一段Lua代碼:UIBillboard的執行邏輯
local UIBase = import("KSFramework/UIBase") local UIBillboard = {} extends(UIBillboard, UIBase) function UIBillboard:OnInit(controller) self.Controller = controller self.TitleLabel = self:GetUIText('Title') self.ContentLabel = self:GetUIText('Content') end function UIBillboard:OnOpen() self.TitleLabel.text = "This is a title" self.ContentLabel.text = "Here is content!" end return UIBillboard
這段lua中,創建了一個Table叫UIBillboard,這個table必須有OnInit(controller)函數。它通過代碼設置了UI中的文字。
好了,接下來,我們要為策划准備配置表了。
4. 創建配置表
打開 Product/SettingSource 目錄,復制一份 StringsTable.xlsx,並改名叫 Billboard.xlsx 吧
公告需求
用Excel打開我們新的 Billboard.xlsx,編輯我們的公告。
我們大概定一下需求,我們假設寫入3條公告,每次打開公告隨機顯示其中一條。每個公告,我們給它一個英文ID,一列中文標題,一列中文內容。
配置公告Excel
Excel表修改如下: (增加公告內容 )
Unity自動監測Excel變動
圖:回到Unity,監測到Excel變動。點擊OK。
自動生成配置表代碼
上一步監測到變動,只編譯Excel表,手動執行一些重新編譯,並生成配置表代碼
tab生成的BillboardSettings類
圖:這時候,打開AppSettings.cs代碼文件,我們可以發現,已經生成名叫BillboardSettings的類了
生成SLua的靜態代碼
因為我們要在Lua使用BillboardSettings讀取配置表,這里需要重新生成一下SLua的靜態代碼
修改Lua隨機讀取一條公告
接下來修改Lua代碼,隨機讀取一條公告,並設置Content、Title
公告內容隨機顯示
圖:運行播放 Game.unity,我們的公告界面完成了
公告界面完成了。我們創建了一個UI、寫了C#和Lua代碼加載它、然后創建了一張配置表,再從Lua讀取配置表,設置UI的顯示。
玩玩熱重載
熱重載Lua
接着我們剛才運行的 Game.unity 。 我們嘗試一下對Lua熱重載:在不重啟游戲的情況,快速重載Lua代碼,方便程序調試。
圖:菜單 KSFramework –> UI –> Reload+ReOpen:熱重載Lua腳本,並重新打開目前處在打開狀態的UI界面
我們可以從菜單執行熱重載並重新打開UI界面,或者使用快捷鍵 Ctrl+Alt+Shift+R。
由於我們的Lua腳本中,每次執行隨機獲取一條公告。因此可以看到公告內容在不停的變動着。
熱重載的實現原理
熱重載的實現,主要依賴於每個lua腳本的最后一行——return Table;C#層在執行完Lua腳本后,會把這個返回的Table緩存起來,每次需要使用table時,直接從緩存拿;而熱重載,實際就是把這個緩存table刪掉,這樣當需要用到這個table時,就會重新執行Lua文件,來獲取Table,這樣就達到了熱重載得目的。
熱重載Excel表格
我們保持運行剛剛的 Game.unity,不要停止掉。這時候我們去修改Excel表格。
圖:修改Excel表格
修改配置表並重載
保存后,回到Unity,提示表格有改動。
圖:發現表格有變動,點擊OK編譯表
圖:從菜單中心一下重載配置表格吧
重載效果
圖:Ctrl+Alt+Shift+R刷新Lua
重載Lua,我們的新修改的配置表內容生效了。
至此,我們的Lua和配置表的改動,都可以在不重啟、不重新轉菊花的情況下快速修改。
版權說明
文/公的Kelly[mr-kelly](簡書作者)
原文鏈接:http://www.jianshu.com/p/ccb491ed4260
著作權歸作者所有,轉載請聯系作者獲得授權。
KSFramework系列
github地址:https://github.com/mr-kelly/KSFramework
歡迎大家到 github提issues