Unity熱更新05-XLua實戰-04 - 優化程式碼
阿新 • • 發佈:2020-10-29
BagPanel
--一個面板對應一個表 BagPanel = {} --"成員變數" --面板物件 BagPanel.panelObj = nil --各個控制元件 BagPanel.btnClose = nil BagPanel.togEquip = nil BagPanel.togItem = nil BagPanel.togGem = nil BagPanel.svBag = nil BagPanel.Content = nil --用來儲存當前 顯示的格子 BagPanel.items = {} --用來儲存當前顯示的頁籤 型別 避免重複重新整理 BagPanel.nowType = -1 --"成員方法" --初始化方法 function BagPanel:Init() if self.panelObj == nil then --例項化面板物件 self.panelObj = ABMgr:LoadRes("ui", "BagPanel", typeof(GameObject)) self.panelObj.transform:SetParent(Canvas, false) --找控制元件 --關閉按鈕 self.btnClose = self.panelObj.transform:Find("btnClose"):GetComponent(typeof(Button)) --找3個toggle local group = self.panelObj.transform:Find("Group") self.togEquip = group:Find("togEquip"):GetComponent(typeof(Toggle)) self.togItem = group:Find("togItem"):GetComponent(typeof(Toggle)) self.togGem = group:Find("togGem"):GetComponent(typeof(Toggle)) --sv相關 self.svBag = self.panelObj.transform:Find("svBag"):GetComponent(typeof(ScrollRect)) self.Content = self.svBag.transform:Find("Viewport"):Find("Content") --加事件 --關閉按鈕 self.btnClose.onClick:AddListener(function() self:HideMe() end) --單選框事件 --切頁籤 --toggle 對應委託 是 UnityAction<bool> self.togEquip.onValueChanged:AddListener(function(value) if value == true then self:ChangeType(1) end end) self.togItem.onValueChanged:AddListener(function(value) if value == true then self:ChangeType(2) end end) self.togGem.onValueChanged:AddListener(function(value) if value == true then self:ChangeType(3) end end) end end --顯示隱藏 function BagPanel:ShowMe() self:Init() self.panelObj:SetActive(true) --第一次開啟是 更新資料 if self.nowType == -1 then self:ChangeType(1) end end function BagPanel:HideMe() self.panelObj:SetActive(false) end --邏輯處理函式 用來切頁籤的 --type 1裝備 2道具 3寶石 function BagPanel:ChangeType(type) --判斷如果已經是該頁籤 就別更新了 if self.nowType == type then return end --切頁 根據玩家資訊 來進行格子建立 --更新之前 把老的格子刪掉 BagPanel.items for i = 1, #self.items do --銷燬格子物件 self.items[i]:Destroy() end self.items = {} --再根據當前選擇的型別 來建立新的格子 BagPanel.items --要根據 傳入的 type 來選擇 顯示的資料 local nowItems = nil if type == 1 then nowItems = PlayerData.equips elseif type == 2 then nowItems = PlayerData.items else nowItems = PlayerData.gems end --建立格子 for i = 1, #nowItems do --根據資料 建立一個格子物件 local grid = ItemGrid:new() --要例項化物件 設定位置 grid:Init(self.Content, (i-1)%4*175, math.floor((i-1)/4)*175) --初始化它的資訊 數量和圖示 grid:InitData(nowItems[i]) --把它存起來 table.insert(self.items, grid) end end
ItemGrid
--用到之前講過的知識 Object --生成一個table 整合Object 主要目的是要它裡面實現的 繼承方法subClass和new Object:subClass("ItemGrid") --“成員變數” ItemGrid.obj = nil ItemGrid.imgIcon = nil ItemGrid.Text = nil --成員函式 --例項化格子物件 function ItemGrid:Init(father, posX, posY) --例項化格子物件 self.obj = ABMgr:LoadRes("ui", "ItemGrid"); --設定父物件 self.obj.transform:SetParent(father, false) --繼續設定他的位置 self.obj.transform.localPosition = Vector3(posX, posY, 0) --找控制元件 self.imgIcon = self.obj.transform:Find("imgIcon"):GetComponent(typeof(Image)) self.Text = self.obj .transform:Find("Text"):GetComponent(typeof(Text)) end --初始化格子資訊 --data 是外面傳入的 道具資訊 裡面包含了 id和num function ItemGrid:InitData(data) --通過 道具ID 去讀取 道具配置表 得到 圖示資訊 local itemData = ItemData[data.id] --想要的是data中的 圖示資訊 --根據名字 先載入圖集 再載入圖集中的 圖示資訊 local strs = string.split(itemData.icon, "_") --載入圖集 local spriteAtlas = ABMgr:LoadRes("ui", strs[1], typeof(SpriteAtlas)) --載入圖示 self.imgIcon.sprite = spriteAtlas:GetSprite(strs[2]) --設定它的數量 self.Text.text = data.num end --加自己的邏輯 function ItemGrid:Destroy() GameObject.Destroy(self.obj) self.obj = nil end