1. 程式人生 > 實用技巧 >Unity熱更新05-XLua實戰-04 - 優化程式碼

Unity熱更新05-XLua實戰-04 - 優化程式碼

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