zoukankan      html  css  js  c++  java
  • UI的重用性

    UI抽取思路

    一款手机游戏中UI有几十个到上百个不等,如果一个一个做这些UI,无疑会花费很多时间。

    近期我们的游戏UI已经是第N次改版了,经过这N多次的修改,我总结了UI其实有很多的共性(就是相同性)。

    下面说一些我觉得常用的UI的抽取思路

    共用按钮

    image

    共同点:按钮,标题,[图标],[消息数提醒]

    思路分析

    按钮点击事件和标题是一定有的,其它的视情况而定。所以我们可以创建一个类 BtnItemClass,用来处理UI的逻辑,外部就只要传入相应的参数就可

    共用组件

    using System;
    using UnityEngine;
    using System.Collections;
    
    /// <summary>
    /// 共用的图文按钮,抽取类
    /// 包括:商店,挑战,朋友,英雄
    /// </summary>
    public class BtnItemClass
    {
        public string TitleSprite;
        public string IconSprite;
        public string BtnName;
        public string NextUITitle;
        //按钮点击的事件
        public UIEventListener.VoidDelegate Callback;
        //消息提醒数
        public string TipMsg;
        public int TipNum;
        private bool IsEnabled;
    
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="btnName">按钮名</param>
        /// <param name="iconSprite">Item 图标</param>
        /// <param name="titleSprite">标题文字图片,没有就填null</param>
        /// <param name="nextUiTitle">下一级UI的标题</param>
        /// <param name="callback">点击的事件</param>
        /// <param name="enabled"></param>
        public BtnItemClass(string btnName, string iconSprite, string titleSprite, string nextUiTitle, UIEventListener.VoidDelegate callback, bool enabled = true)
        {
            this.BtnName = btnName;
            this.IconSprite = iconSprite ?? "null";
            this.TitleSprite = titleSprite ?? "null";
            this.NextUITitle = nextUiTitle;
            this.Callback = callback;
            IsEnabled = enabled;
        }
    
        public BtnItemClass()
        {
        }
    //设置属性
        public static void Bind(BtnItemClass itemClass, Transform trans)
        {
            if(!string.IsNullOrEmpty( itemClass.BtnName))
                trans.name = itemClass.BtnName;
    
            //标题文字图片
            UISprite titleSprite = CTool.GetChildComponent<UISprite>("TitleSprite", trans);
            titleSprite.spriteName = itemClass.TitleSprite;
            titleSprite.MakePixelPerfect();
    
            //图标
            UISprite iconSprite = CTool.GetChildComponent<UISprite>("IconSprite", trans);
            iconSprite.spriteName = itemClass.IconSprite;
            iconSprite.MakePixelPerfect();
    
            //当标题图片找不到时就显示文字
            var titleLabel = CTool.GetChildComponent<UILabel>("TitleLabel", trans);
            if (string.IsNullOrEmpty(itemClass.TitleSprite)|| itemClass.TitleSprite == "null")
            {
                titleLabel.text = itemClass.NextUITitle;
                titleLabel.gameObject.SetActive(true);
            }
            else
            {
                titleLabel.gameObject.SetActive(false);
            }
    
            //绑定事件
            trans.GetComponent<UIEventListener>().onClick = itemClass.Callback;
    
            //button.isEnabled = item.IsEnable = item.IsEnable;
        }
    }

    使用方法

    首先构建一个List,里面里包含当前的UI所有按钮的数据,然后做刷新UI(生成按钮,设置按钮属性)

    //按钮数据
    private List<BtnItemClass> UIConfigList
    {
        get
        {
            return new List<BtnItemClass>()
           {
    
               new BtnItemClass("BtnHeroList", "BattleTeam_icon_HeroStrong", "null", "英雄强化",
                   obj => CNetPlayer.CheckPackageOverflow_WithMsgBox(() => CUIHeroList.Show("英雄强化"))),
               new BtnItemClass( "武器强化,obj => CUIPowerUp.ShowWeaponstSelectList()),
           };
        }
    }
    
    //刷新UI
    private void RefreshUI()
    {
        var max = UIConfigList.Count;
        CUIHelper.ResizeCUITableGridGameObjects(TableGrid, max, CommPicBtnTemplate);
    
        for (int idx = 0; idx < max; idx++)
        {
            var trans = TableGrid.transform.GetChild(idx);
            var itemClass = UIConfigList[idx];
            BtnItemClass.Bind(itemClass, trans);
        }
    
        TableGrid.Reposition();
    }
  • 相关阅读:
    【YbtOJ#20064】预算缩减
    【GMOJ6805】模拟speike
    【洛谷P5675】取石子游戏
    【YbtOJ#20061】波动序列
    【洛谷P4302】字符串折叠
    flash 上传文件
    HTTP 客户端发送的 头 格式
    FLEX 在本地使用 只访问本地文件
    as3 重写
    iis7 上传限制问题
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/4304704.html
Copyright © 2011-2022 走看看