GameFramework框架实现七天活动功能

功能需求

在这里插入图片描述
功能需求如图,首先分析怎么做,搭UI很简单,但是如何更简单更加易于修改与维护呢?
算了,这些先不想,需要读表,那就先把表导入进去吧
在这里插入图片描述
在这里插入图片描述
由这两个表可以看出,要先从表SevenDayLogin中读出奖励描述,图片ID,然后通过ID在UIItem表中得到图片具体信息路径,资源名.通过这些东西,我们就可以很好的找出图片资源了
然后编写两个表的读表脚本并加进ProcedurePreload流程中

在这里插入图片描述
如图,代码如下
UIItem表

using GameFramework.DataTable;
using System.Collections.Generic;

namespace StarForce
{

public class DRUIItem : IDataRow
{
    /// <summary>
    /// 道具编号。
    /// </summary>
    public int Id
    {
        get;
        protected set;
    }
    /// <summary>
    /// 道具名称。
    /// </summary>
    public string ItemName
    {
        get;
        protected set;
    }
    /// <summary>
    /// 道具图片路径。
    /// </summary>
    public string PicPath
    {
        get;
        protected set;
    }
    /// <summary>
    /// 道具图片名称。
    /// </summary>
    public string PicName
    {
        get;
        protected set;
    }
    /// <summary>
    /// 道具价格。
    /// </summary>
    public int Price
    {
        get;
        protected set;
    }
    /// <summary>
    /// 道具价速度加成。
    /// </summary>
    public int SpeedAdd
    {
        get;
        protected set;
    }
    /// <summary>
    /// 道具价攻击力加成。
    /// </summary>
    public int AttackAdd
    {
        get;
        protected set;
    }
    /// <summary>
    /// 道具价防御力加成。
    /// </summary>
    public int DefenceAdd
    {
        get;
        protected set;
    }
    /// <summary>
    /// 道具描述。
    /// </summary>
    public string Des
    {
        get;
        protected set;
    }
    public void ParseDataRow(string dataRowText)
    {
        string[] text = DataTableExtension.SplitDataRow(dataRowText);
        int index = 0;
        index++;
        Id = int.Parse(text[index++]);
        ItemName = text[index++];
        PicPath = text[index++];
        PicName = text[index++];
        Price = int.Parse(text[index++]);
        SpeedAdd = int.Parse(text[index++]);
        AttackAdd = int.Parse(text[index++]);
        DefenceAdd = int.Parse(text[index++]);
        Des = text[index++];
    }

    private void AvoidJIT()
    {
        new Dictionary<int, DRUIItem>();
    }
}

}

SevenDayLogin表

using GameFramework.DataTable;
using System.Collections.Generic;



namespace StarForce
{

    public class DRSevenDayLogin : IDataRow
    {
       
        public int Id
        {
            get;
            private set;
        }
        public string AwardName
        {
            get;
            private set;
        }

        public string AwardDescribe
        {
            get;
            private set;
        }

        public string LoginAwardItems
        {
            get;
            private set;
        }

        public int LoginDays
        {
            get;
            private set;
        }
        


        public void ParseDataRow(string dataRowText)
        {
            string[] text = DataTableExtension.SplitDataRow(dataRowText);
            int index = 0;
            index++;
            Id = int.Parse(text[index++]);
            AwardName = text[index++];
            AwardDescribe = text[index++];
            LoginAwardItems = text[index++];
            LoginDays=int.Parse(text[index++]);
        }

        private void AvoidJIT()
        {
            new Dictionary<int, DRSevenDayLogin>();
        }
    }
}


注意名字别写错

UI分析

表也读完了,这个怎么做呢,老老实实拼UI呗
在这里插入图片描述
ok,UI拼完了,但是好low啊有没有,跟需求完全差十万八千里,怎么说.
解释一下,是因为这个一条一条的,明显重复,可以实例化出来,还有那个奖励的图片,同样可以实例化出来,读表读多少个就实例化多少个不是很爽,问题来了,Scroll View忘了怎么用了,先查查.

  1. 创建一个Scroll View并调节它的大小,展示出来的部分
  2. 左右滑的话Vertical勾掉,上下滑勾掉Horizontal
  3. 调整Content的大小,这里边是放你要展示的图片的,具体大小已展示物体多少来定
  4. 在content下放好要展示的东西,如果左右滑就删掉上下滑的滑动条,上下滑反之
  5. 然后调节Scroll View的透明度,记住如果要做预制体的话,不要删Image
  6. 现在就可以使用了,apply没有问题
  7. 等等,实例化出来的会按我们想要的效果排列吗?这个时候就用到了排版工具
    在这里插入图片描述
    奖励图片的话,搞个空节点当父物体好了,同样加上排版工具
    在这里插入图片描述
    测试下没问题,对了,Item不要放Content下,这个待会说
    好了,UI拼完,拉成预制,在UIForm表中加入这个UI预制的名字
    在这里插入图片描述
    在UIFormId里加入这个名字和ID
    在这里插入图片描述
    OK,要打开这个Form,就在之前界面的活动的Btn上加个监听事件吧,
    在这里插入图片描述
    然后呢,就写SevenDayForm脚本挂载在UI预制体上
    代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using GameFramework;
using GameFramework.DataTable;
using UnityEngine.UI;

namespace StarForce
{
    public class SevenDayForm : UGuiForm
    {
        private GameObject itemPrefab;//预制模板


        private int totalDays;//实例化多少格,即读表读出多少行
        //Item的父节点
        private Transform grid;

        protected override void OnInit(object userData)
        {
            base.OnInit(userData);
            //初始化界面,找到预制体的位置
            itemPrefab = transform.Find("bg/Scroll View/Viewport/Item").gameObject;
            //设置好Item父节点的位置
            grid = transform.Find("bg/Scroll View/Viewport/Content");
        }
        protected override void OnOpen(object userData)
        {
            base.OnOpen(userData);
            //在打开UI时候执行以下方法
            InitSevenDayItems();
        }
        private void InitSevenDayItems()
        {
            //读表固定操作
            IDataTable<DRSevenDayLogin> dtSevenDayLogins = GameEntry.DataTable.GetDataTable<DRSevenDayLogin>();
            totalDays = dtSevenDayLogins.Count;//行数
            //通过一个for循环来实例化具体行数
            for (int i = 0; i < totalDays; i++)
            {
                //实例化预制体
                GameObject item = Instantiate(itemPrefab);
                //显示出来
                item.SetActive(true);
                //设置好父节点
                item.transform.SetParent(grid);
                //获取数据表行,第一行
                DRSevenDayLogin dtSevenDayLogin = dtSevenDayLogins.GetDataRow(i + 1);
                //给实例化出来的预制体添加一个脚本,就是下面写的那个类,并实现SetSevenDayItemInfo方法,传过去这一行的数据
                item.AddComponent<SevenDayLoginItem>().SetSevenDayItemInfo(dtSevenDayLogin);
            }
        }
        /// <summary>
        /// 关闭按钮
        /// </summary>
        public void CloseBtn()
        {
            GameEntry.UI.OpenUIForm(UIFormId.GameoneForm, this);
            
            Close(this);
        }
        /// <summary>
        /// 当关闭的时候,删掉这些实例化,以免再次打开时候出错
        /// </summary>
        /// <param name="userData"></param>
        protected override void OnClose(object userData)
        {
            base.OnClose(userData);
            for (int i = 0; i < grid.childCount; i++)
            {
                Destroy(grid.GetChild(i).gameObject); //立即对对像进行销毁
            }
        }

    }
    /// <summary>
    /// 给Item添加的脚本
    /// </summary>
    public class SevenDayLoginItem : MonoBehaviour
    {
        //展示文本
        private Text des;
        //item奖励图片模板
        private GameObject itemImgPrefab;
        /// <summary>
        /// 父节点
        /// </summary>
        private Transform Imggrid;

        private void Awake()
        {
            //得到展示文本,图片预制和图片父节点
            des = transform.Find("miaoshuImg/miaoshuText").GetComponent<Text>();
            itemImgPrefab = transform.Find("jiangliImg").gameObject;
            Imggrid = transform.Find("jiangliGird");
        }
        public void SetSevenDayItemInfo(DRSevenDayLogin info)
        {
            //展示文本即是读表得到的AwardDescribe
            des.text = info.AwardDescribe;
            //用List来接一下截取字符串工具的成果
            List<string> items = DataTableExtension.GetItemIdAndNumString(info.LoginAwardItems);
            //截到几个就有几个图片,然后通过for循环来附上图片
            for (int i = 0; i < items.Count; i++)
            {
                //实例化图片
                GameObject itemImg = Instantiate(itemImgPrefab);
                itemImg.SetActive(true);//显示
                itemImg.transform.SetParent(Imggrid);//设置好父节点
                //当List不为空的时候
                if (items!=null)
                {
                    //实例化的图片的sprite=传过来一个道具Id,得到资源(用井号分割ID和数量的List的第零位即ID)
                    itemImg.GetComponent<Image>().sprite = UIExtension.GetItemSprite(DataTableExtension.GetItemIdAndNum(items[i])[0]);
                }
                
                
            }
        }
    }
}


中间用到的几个工具的代码如下
DataTableExtension

/// <summary>
        /// 用|分割表内数据
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static List<string> GetItemIdAndNumString(string data)
        {
            if (!data.Contains("#")||!data.Contains("|"))
            {
                return null;
            }
            List<string> retList = new List<string>();
            string[] items = data.Split(new char[] { '|' });
            for (int i = 0; i < items.Length; i++)
            {
                retList.Add(items[i]);
            }
            return retList;
        }
        /// <summary>
        /// 用#分割
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static int[] GetItemIdAndNum(string data)
        {
            if (!data.Contains("#"))
            {
                return null;
            }
            int[] retArray = new int[2];
            string[] item = data.Split(new char[] { '#' });

            for (int i = 0; i < item.Length; i++)
            {
                retArray[0] = Convert.ToInt32(item[0]);
                retArray[1] = Convert.ToInt32(item[1]);
            }

            return retArray;
        }

UIExtension

/// <summary>
        /// 传过来一个道具id  Sprite
        /// </summary>
        /// <param name="ItemId"></param>
        /// <returns></returns>
        public static Sprite GetItemSprite(int ItemId)
        {
            IDataTable<DRUIItem> drItems = GameEntry.DataTable.GetDataTable<DRUIItem>();

            DRUIItem drItem = drItems.GetDataRow(ItemId);

            Sprite sprite = null;

            if (sprite == null)
            {
                string path = drItem.PicPath + "/" + drItem.PicName;
                sprite = Resources.Load<Sprite>(path);
                if (sprite != null) return sprite;
            }

            if (sprite == null)
            {
                Debug.LogError("找不到" + drItem.PicPath + drItem.PicName + "文件");
            }
            return sprite;
        }

好了,运行一下看下效果
在这里插入图片描述
就是这样咯,虽然很low,但是大体思路是这样滴

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
UnityGameFramework案例源码,包括: 主要对游戏开发过程中常用模块进行了封装,很大程度地规范开发过程、加快开发速度并保证产品质量,是一个重度化的Unity游戏框架。 在最新的 Game Framework 版本中,包含以下 17 个内置模块,后续还将开发更多的扩展模块供开发者使用。 数据结点 (Data Node) – 将任意类型的数据以树状结构的形式进行保存,用于管理游戏运行时的各种数据。 数据表 (Data Table) – 可以将游戏数据以表格(如 Microsoft Excel)的形式进行配置后,使用此模块使用这些数据表。数据表的格式是可以自定义的。 调试器 (Debugger) – 当游戏在 Unity 编辑器中运行或者以 Development 方式发布运行时,将出现调试器窗口,便于查看运行时日志、调试信息等。用户还可以方便地将自己的功能注册到调试器窗口上并使用。 下载 (Download) – 提供下载文件的功能,支持断点续传,并可指定允许几个下载器进行同时下载。更新资源时会主动调用此模块。 实体 (Entity) – 我们将游戏场景中,动态创建的一切物体定义为实体。此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。实体使用结束后可以不立刻销毁,从而等待下一次重新使用。 事件 (Event) – 游戏逻辑监听、抛出事件的机制。Game Framework 中的很多模块在完成操作后都会抛出内置事件,监听这些事件将大大解除游戏逻辑之间的耦合。用户也可以定义自己的游戏逻辑事件。 有限状态机 (FSM) – 提供创建、使用和销毁有限状态机的功能,一些适用于有限状态机机制的游戏逻辑,使用此模块将是一个不错的选择。 本地化 (Localization) – 提供本地化功能,也就是我们平时所说的多语言。Game Framework 在本地化方面,不但支持文本的本地化,还支持任意资源的本地化,比如游戏中释放烟花特效也可以做出几个多国语言的版本,使得中文版里是“新年好”字样的特效,而英文版里是“Happy New Year”字样的特效。 网络 (Network) – 提供使用 Socket 长连接的功能,当前我们支持 TCP 协议,同时兼容 IPv4 和 IPv6 两个版本。用户可以同时建立多个连接与多个服务器同时进行通信,比如除了连接常规的游戏服务器,还可以连接语音聊天服务器。如果想接入 ProtoBuf 之类的协议库,只要派生自 Packet 类并实现自己的消息包类即可使用。 对象池 (Object Pool) – 提供对象缓存池的功能,避免频繁地创建和销毁各种游戏对象,提高游戏性能。除了 Game Framework 自身使用了对象池,用户还可以很方便地创建和管理自己的对象池。 流程 (Procedure) – 是贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是一个非常好的习惯。对于网络游戏,你可能需要如检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用。 资源 (Resource) – 为了保证玩家的体验,我们不推荐再使用同步的方式加载资源,由于 Game Framework 自身使用了一套完整的异步加载资源体系,因此只提供了异步加载资源的接口。不论简单的数据表、本地化字典,还是复杂的实体、场景、界面,我们都将使用异步加载。同时,Game Framework 提供了默认的内存管理策略(当然,你也可以定义自己的内存管理策略)。多数情况下,在使用 GameObject 的过程中,你甚至可以不需要自行进行 Instantiate 或者是 Destroy 操作。 场景 (Scene) – 提供场景管理的功能,可以同时加载多个场景,也可以随时卸载任何一个场景,从而很容易地实现场景的分部加载。 配置 (Setting) – 以键值对的形式存储玩家数据,对 UnityEngine.PlayerPrefs 进行封装。 声音 (Sound) – 提供管理声音和声音组的功能,用户可以自定义一个声音的音量、是2D声音还是3D声音,甚至是直接绑定到某个实体上跟随实体移动。 界面 (UI) – 提供管理界面和界面组的功能,如显示隐藏界面、激活界面、改变界面层级等。不论是 Unity 内置的 uGUI 还是其它类型的 UI 插件(如 NGUI),只要派生自 UIFormLogic 类并实现自己的界面类即可使用。界面使用结束后可以不立刻销毁,从而等
GameFramework是一个用于游戏开发的框架。它提供了一个完整的游戏开发流程,包括游戏设计、编程、资源管理、场景管理、消息处理、资源加载、网络通信等方面的功能和模块。 首先,GameFramework提供了游戏设计方面的支持。它定义了游戏的基本组成部分,如场景、角色、道具等,并提供了相应的类和接口来方便开发者进行游戏设计。 其次,GameFramework具备强大的编程支持。它包括了一系列的工具和类库,用于处理游戏逻辑,实现游戏的功能和特性。开发者可以通过编程来实现游戏中的动画效果、碰撞检测、物理模拟等。 GameFramework还提供了资源管理和加载的功能。开发者可以通过它来管理游戏中的资源文件,包括图片、音频、视频等,同时它也提供了快速的资源加载方式,提高游戏的性能和用户体验。 此外,GameFramework还包含了场景管理和消息处理的功能。它可以管理游戏中的不同场景,方便游戏的切换和管理。同时,它还能处理游戏中的消息通信,让不同的游戏对象之间进行交互和通信。 最后,GameFramework还具备网络通信的能力。开发者可以使用它来实现网络游戏中的客户端和服务器的通信,包括数据传输、消息处理等。 总的来说,GameFramework是一个功能完备的游戏开发框架,它为开发者提供了全面的游戏开发支持,使得游戏开发变得更加高效和简单。无论是个人独立开发者还是大型游戏公司,都可以利用GameFramework来开发出优秀的游戏作品。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值