Unity3D熱更新LuaFramework入門實戰(5)——UI
界面系統在遊戲中佔據重要地位。遊戲界面是否友好,很大程度上決定了玩家的體驗;界面開發是否便利,也影響著遊戲的開發進度。Unity3D 的UGUI系統,使用戶可以「可視化地」開發界面,那麼怎樣用Lua去調用UGUI呢?
微博 @羅培羽
1、顯示UI界面
下面演示如何顯示一個UI界面。由於UI界面也是一種資源,使用第二篇「資源熱更新」的方法即可。這個例子中,製作一個含有按鈕的界面,然後組成名為Panel1的UI預設,存放到Tank目錄下。
圖:Panel1
前面(第二篇)已在Packager類HandleExampleBundle方法中添加了一句「AddBuildMap("tank" + AppConst.ExtName, "*.prefab", "Assets/Tank");」(當然也可以添加到其他地方),它會把Tank目錄下的所有預設打包成名為tank的資源包。故而點擊「Build xxx Resource」後,Panel1也會被打包到tank資源包中。
修改Lua入口函數Main.lua中的Main方法,在載入資源後把panel1放到Canvas下(需要在場景中添加畫布),然後調整它的位置和大小。
--主入口函數。從這裡開始lua邏輯nfunction Main()tttttntLuaHelper = LuaFramework.LuaHelper;ntresMgr = LuaHelper.GetResManager();ntresMgr:LoadPrefab(tank, { Panel1 }, OnLoadFinish);nendn n--載入完成後的回調--nfunction OnLoadFinish(objs)nt--顯示面板ntgo = UnityEngine.GameObject.Instantiate(objs[0]);ntlocal parent = UnityEngine.GameObject.Find("Canvas")n go.transform:SetParent(parent.transform);n go.transform.localScale = Vector3.one;n go.transform.localPosition = Vector3.zero;nendn
運行遊戲,即可看到載入出來的界面。
圖:載入出來的界面
2、事件響應
c#中可以使用事件監聽的方法給UI組件添加事件。例如,添加按鈕點擊事件的方法如下:
ttButton btn = go.GetComponent<Button> ();nttbtn.onClick.AddListenerntt(ntttdelegate() nttt{nttttthis.OnClick(go)nttt}ntt);n
然而在LuaFramework的API中,沒能找到合適的方法,只能根據第三篇中「自定義API」的方法,自己編寫一套了。編寫UIEvent類,它包含用於添加監聽事件的AddButtonClick和清除監聽事件的ClearButtonClick方法,代碼如下所示(完成後記得要「修改CustomSetting」和「生成wrap文件」)。
using UnityEngine;nusing System.Collections;nusing LuaInterface;nusing UnityEngine.UI;n npublic class UIEvent n{nt//添加監聽ntpublic static void AddButtonClick(GameObject go, LuaFunction luafunc) nt{nttif (go == null || luafunc == null) ntttreturn;n nttButton btn = go.GetComponent<Button> ();nttif (btn == null)ntttreturn;n nttbtn.onClick.AddListenerntt(ntttdelegate() nttt{nttttluafunc.Call(go);nttt}ntt);nt}n nt//清除監聽ntpublic static void ClearButtonClick(GameObject go) nt{nttif (go == null) ntttreturn;nttnttButton btn = go.GetComponent<Button> ();nttif (btn == null)ntttreturn;nttnttbtn.onClick.RemoveAllListeners();nt}n}n
接下來測試下這套API,修改Main.lua,代碼如下:
--主入口函數。從這裡開始lua邏輯nfunction Main()tttttnt略nendn n--載入完成後的回調--nfunction OnLoadFinish(objs)nt--顯示面板nt略nt--事件處理ntlocal btn = go.transform:FindChild("Button").gameObjectntUIEvent.AddButtonClick(btn, OnClick)nendn nfunction OnClick()ntprint("觸發按鈕事件")nendn
運行遊戲,點擊按鈕,OnClick方法即被調用。
圖:按鈕的事件響應
讀者可以使用相似的方法監聽其他UI組件,這裡就只演示按鈕事件了。
3、界面管理器
LuaFramework提供了一套簡單的(不完善的)界面管理器,具體代碼請參見PanelManager類。PanelManager類的CreatePanel方法完成非同步載入資源,在載入完成後,會設置面板的大小和位置,然後調用回調函數。與上面用lua載入界面的方法完全一樣。
圖:PanelManager的CreatePanel方法
LuaFramework會給每個界面添加名為LuaBehaviour的組件,它擁有用於添加按鈕監聽的AddClick方法,相關代碼如下,與UIEvent的AddButtonClick方法相似。
圖:LuaBehaviour的AddClick方法
在LuaFramework的PureMVC架構中,如果要添加一個界面,需要編寫對應的Controller、View,以及修改3個框架自帶的lua文件,比較繁瑣。因此在實際項目中有必要重寫PanelManager,由它實現界面的載入及事件處理。
廣告時間:
《Unity3D網路遊戲實戰》的第五章「代碼分離的界面系統」介紹了一套通用UI系統的實現方法,有興趣的讀者可以看看。
圖:《Unity3D網路遊戲實戰》界面系統
《專訪仙劍同人遊戲團隊:這是我們的「心愿」》新浪遊戲對心愿團隊的採訪稿,說出遊戲開發過程中悲歡離合。http://games.sina.com.cn/zl/duanpian/2014-10-31/1146130.shtml
推薦閱讀:
※HammerSpoon - 不止是窗口管理
※用好Lua+Unity,讓性能飛起來—LuaJIT性能坑詳解
※Lua程序逆向之Luac文件格式分析
※用LuaStudio調試Unity中SLua里的Lua5.3代碼
※維基百科中模板和模塊有什麼區別?