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,但是大體思路是這樣滴

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章