Unity熱更新05-XLua實戰-03 - BagPanel更新
阿新 • • 發佈:2020-10-29
--一個面板對應一個表 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 --銷燬格子物件 GameObject.Destroy(self.items[i].obj) 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 = {} --用一張新表 代表 格子物件 裡面的屬性 儲存對應想要的資訊 grid.obj = ABMgr:LoadRes("ui", "ItemGrid"); --設定父物件 grid.obj.transform:SetParent(self.Content, false) --繼續設定他的位置 grid.obj.transform.localPosition = Vector3((i-1)%4 * 175, math.floor((i-1)/4)*175, 0) --找控制元件 grid.imgIcon = grid.obj.transform:Find("imgIcon"):GetComponent(typeof(Image)) grid.Text = grid.obj .transform:Find("Text"):GetComponent(typeof(Text)) --設定它的圖示 --通過 道具ID 去讀取 道具配置表 得到 圖示資訊 local data = ItemData[nowItems[i].id] --想要的是data中的 圖示資訊 --根據名字 先載入圖集 再載入圖集中的 圖示資訊 local strs = string.split(data.icon, "_") --載入圖集 local spriteAtlas = ABMgr:LoadRes("ui", strs[1], typeof(SpriteAtlas)) --載入圖示 grid.imgIcon.sprite = spriteAtlas:GetSprite(strs[2]) --設定它的數量 grid.Text.text = nowItems[i].num --把它存起來 table.insert(self.items, grid) end end