利用MVC来做背包系统
MVC至少要建立四个文件脚步
M脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
public class BagModle {
//MVC格式 modle纯数据格式 不需要继承monoBehaviour
// Use this for initialization
private static BagModle _instance;
private BagModle()
{
readJson();
}
public static BagModle Instance()
{
if (_instance == null)
{
return _instance = new BagModle();
}
return _instance;
}
//一般来说配置表的内容是不进行增删改查 所以ItemInfo不进行修改
public struct ItemInfo
{
public string id;//物品id
public string name;//物品名称
public string icon;//物品图片
}
public struct BagInfo
{
public string id;//背包项id
public int count;//背包中物品数量
public string itemId;//物品id
public ItemInfo itemInfo;//物品信息
}
//利用字典存储
Dictionary<string, ItemInfo> itemDit = new Dictionary<string, ItemInfo>();
List<BagInfo> bagList = new List<BagInfo>();
void readJson()
{
TextAsset textFile = Resources.Load("bagitem", typeof(TextAsset))as TextAsset;
JsonData obj = JsonMapper.ToObject(textFile.ToString());
Debug.Log("来吧");
for(int i = 0; i < obj.Count; i++)
{
ItemInfo info = new ItemInfo();
info.id = obj[i]["id"].ToString();
info.name = obj[i]["name"].ToString();
info.icon = obj[i]["icon"].ToString();
Debug.Log(info.icon);
itemDit.Add(info.id,info);
}
}
public ItemInfo GetItemInfoById(string id)
{
return itemDit[id];
}
public void addInfoToBag(string id,int count,string Itemid)
{
BagInfo bagInfo = new BagInfo();
bagInfo.id = id;//将配置表中的id赋给baginfo
bagInfo.count = count;//将count 值赋给info的count
bagInfo.itemId = Itemid;
bagInfo.itemInfo = GetItemInfoById(Itemid);//通过itemid找到对应iteminfo信息
bagList.Add(bagInfo);//将info添加到list中
}
public void RemoveFromBag(int index)
{
bagList.Remove(bagList[index]);
}
public List<BagInfo> GetBagList()
{
return bagList;
}
}
C脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BagController : MonoBehaviour {
public BagView bagView;
BagModle bm;
void Start () {
bm = BagModle.Instance();
bm.addInfoToBag("1",5, "1001");
bm.addInfoToBag("2",12, "1002");
bm.addInfoToBag("3",3, "1003");
UpdateView();
}
// Update is called once per frame
void Update () {
}
void UpdateView()
{
List<BagModle.BagInfo> list = new List<BagModle.BagInfo>();
list = bm.GetBagList();
bagView.Refresh(list);
}
void removeItem(int index)
{
bagView.Clear();
bm.RemoveFromBag(index);
UpdateView();
}
}
ItemView脚ben
:using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ItemView : MonoBehaviour {
// Use this for initialization
public Image m_icon;
public Text m_name;
public Text m_count;
void Start () {
}
// Update is called once per frame
void Update () {
}
public void RefreshItem(BagModle.BagInfo bagInfo)
{
BagModle.ItemInfo info = bagInfo.itemInfo;
Sprite tempType = new Sprite();
m_icon.sprite = Resources.Load(info.icon,tempType.GetType())as Sprite;
m_name.text = info.name;
m_count.text = bagInfo.count+"";
this.transform.GetComponent<Button>().onClick.AddListener(
delegate ()
{
this.OnRemoveSelected(this.gameObject);
}
);
}
void OnRemoveSelected(GameObject sender)
{
string name = sender.name;
int index = int.Parse(name);
SendMessageUpwards("removeItem",index);
}
public void Write()
{
Debug.Log("测试SendMessage");
}
}
背包 BagView
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BagView : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void Refresh(List<BagModle.BagInfo> list)
{
for(int i = 0; i < list.Count; i++)
{
GameObject go =(GameObject)Instantiate(Resources.Load<GameObject>("Item"));
go.name = i+"";
go.transform.SetParent(this.transform);
go.GetComponent<ItemView>().RefreshItem(list[i]);
}
}
public void Clear()
{
int count = this.transform.childCount;
for(int i = 0; i < count; i++)
{
Destroy(this.transform.GetChild(i).gameObject);
}
}
}