• 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
    
  • 相关阅读:
    Linux内核学习第五周 系统调用
    Linux内核学习第三周 Linux启动过程分析
    WebStorm快捷键大全
    PAT乙级-1056. 组合数的和(15)
    PAT乙级-1043. 输出PATest(20)
    PAT乙级-1021.个位数统计(15)
    PAT乙级-1036.跟奥巴马一起编程(15)
    学习笔记-C++ STL iterator与对指针的理解-20170618
    学习笔记-Little Tips_day20170615-" " and ' '
    HTML5离线存储和本地缓存
  • 原文地址:https://www.cnblogs.com/unitysir/p/13896878.html
Copyright © 2020-2023  润新知