前言:做背包系统时需要思考的问题:
/// 数据的来源:服务器数据+表数据
/// 服务器数据:数据记录在服务器的,这个数据每个玩家都可能不一样,比如装备的数量;id :1001,count:5个
/// 表数据:所有的玩家都一样的数据;比如一个装备icon,名字;id:1001,icon:“1001”,name:"des:“锋刃”
/// 怎么样将服务器数据和表数据组合成一条完整的数据?
/// 通过id组合
1.封装服务器数据类
/// <summary>
///封装的服务器数据类
/// </summary>
public class ItemServerData {
public int id;
public int count;
public ItemServerData() { }
public ItemServerData(int id, int count) {
this.id = id;
this.count = count;
}
}
2.创建一个背包数据的单例
让外界通过单例来调用类的成员
因为游戏中只可能有一个玩家背包
public class BagDataManager {
private static BagDataManager instance;
public static BagDataManager Instance {
get {
if (instance == null) {
instance = new BagDataManager();
}
return instance;
}
}
3.初始化背包数据
private string bagDataPath = "D:/bagData.json";
List<ItemServerData> list = null;
/// <summary>
/// 初始化背包数据
/// </summary>
private BagDataManager() {
if (!File.Exists(bagDataPath))
{
//玩家第一次打开游戏的时候,本地是没有数据,那就创建一个初始数据
//创建了之后存在本地;
//第二次打开游戏的时候,读取之前存的信息
list = new List<ItemServerData>();
ItemServerData data1 = new ItemServerData(10001, 4);
list.Add(data1);
ItemServerData data2 = new ItemServerData(10002, 5);
list.Add(data2);
ItemServerData data3 = new ItemServerData(10003, 8);
list.Add(data3);
ItemServerData data4 = new ItemServerData(20002, 2);
list.Add(data4);
ItemServerData data5 = new ItemServerData(20003, 6);
list.Add(data5);
ItemServerData data6 = new ItemServerData(30001, 7);
list.Add(data6);
ItemServerData data7 = new ItemServerData(30002, 9);
list.Add(data7);
string json = JsonMapper.ToJson(list);
File.WriteAllText(bagDataPath, json, System.Text.Encoding.UTF8);
}
else {
string json = File.ReadAllText(bagDataPath);
list = JsonMapper.ToObject<List<ItemServerData>>(json);
}
}
4.写一个方法供外界获取背包中的所有数据
/// <summary>
/// 获取背包中所有的装备数据
/// </summary>
/// <returns></returns>
public List<ItemServerData> GetAllData() {
return list;
}
5.在控制器中将Model数据层传来的数据传给视图层
List<ItemServerData> bagDataList;
void Awake(){
bagDataList = BagDataManager.Instance.GetAllData();
}
6.视图层负责显示将控制器中传来的数据显示在背包面板中
public class BagRightView : MonoBehaviour {
public Transform itemContent;
private GameObject itemCellMod;
/// <summary>
/// Controller层将数据传过来
/// </summary>
/// <param name="dataList"></param>
public void Show(List<ItemServerData> dataList) {
//如果场景中没有格子模型
if (itemCellMod == null) {
//则通过Resources文件夹进行加载
itemCellMod = Resources.Load<GameObject>("Prefabs/UI/ItemCell");
}
//遍历list所保存的背包数据
for (int i = 0; i < dataList.Count; i++)
{
//克隆格子模型
GameObject item = Instantiate(itemCellMod);
//找到格子模型的父物体
item.transform.parent = itemContent;
//将格子的自身缩放归一:统一尺寸
item.transform.localScale = Vector3.one;
//将格子的自身位置归零:统一位置
item.transform.localPosition = Vector3.zero;
//找到负责显示的视图组件
ItemCellView icv = item.GetComponent<ItemCellView>();
//调用其中的显示方法
icv.Show(dataList[i]);
}
}
}