功能需求
功能需求如圖,首先分析怎麼做,搭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忘了怎麼用了,先查查.
- 創建一個Scroll View並調節它的大小,展示出來的部分
- 左右滑的話Vertical勾掉,上下滑勾掉Horizontal
- 調整Content的大小,這裏邊是放你要展示的圖片的,具體大小已展示物體多少來定
- 在content下放好要展示的東西,如果左右滑就刪掉上下滑的滑動條,上下滑反之
- 然後調節Scroll View的透明度,記住如果要做預製體的話,不要刪Image
- 現在就可以使用了,apply沒有問題
- 等等,實例化出來的會按我們想要的效果排列嗎?這個時候就用到了排版工具
獎勵圖片的話,搞個空節點當父物體好了,同樣加上排版工具
測試下沒問題,對了,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,但是大體思路是這樣滴