本系列为学习记录,作为学习他人传播的知识,为方便自我总结,侵删。
学习来源:http://www.taikr.com/my/course/444
背包系统一般情况需要构建三个板块,一存储的物品信息,二物品之间如何操作,三用户界面的搭建。
物品信息,则需要定义一个基类,通过继承然后写出更多具有相同的基本属性,而拥有自己特有属性的派生类。
public class Item
{
public int ID{get; private set;}
public string Name{get;private set;}
public string Descirption{get;private set;}
public string ItemType{get;protected set;}//物品类的标签
public Item(int Id,string name,string descirption)
{
this.ID=Id;
this.Name=name;
this.Description=description;
}
}
随便写的一些基类属性,重点在于知道方法就好。
得到了基类后,再定义一个类继承基类。
public class Weapon :Item
{
public int Damage{get;private set;}
public Weapon(int Id,string name,string description,int damage):base(Id,name,description)
{
this.Damage=damage;
base.ItemType="Weapon";//物品标签为武器
}
}
可以多写几个派生类,但本质上都一样,只要将新增加的属性加入该派生类的构造函数中,再调用即可。标签用于后续区分是哪一类,读取相应的数据。
搭建UI界面,只需要在创建出来的画布下新建一个Image(重命名成Knapscak),利用该Image来作为背景。添加一个Grid Layout Group(Script)组件,用于将背包格子规范化。添加image(重命名Grid)作为格子,设置为预制体。
接着,创建一个脚本KnapscakUI给Knapscak,用于得到背包格子。
public class Knapscak:MonoBehaviour{
public Transform[] Grid;
public Transform GetEmptyGrid()
{
for(int i=0;i<Grid.Length;i++)
{
if(Grid[i].childCount==0)
return Grid[i];
}
return null;
}
}
脚本添加后记得赋值,将在Knapscak下的网格拖入脚本的Grid上。
在创建管理整个背包系统前,需要对背包内的物品做准备工作。
一,对信息的处理脚本ItemModel类,全部设置为静态类型,方便使用。
public class ItemModel
{
//定义字典,以名字为键,Item为值,存储物品
private static Dictionary<string,Item> GridItem=new Dictionary<string,Item>();
//信息存储
public static void StoreItem(string name,Item item)
{
if(GridItem.ContainsKey(name))
{
DeleteItem(name);//如果物品已经存在则删除
}
else
GridItem.Add(name,item);
//得到物品信息
public static Item GetItem(string name)
{
if(GridItem.ContainsKey(name))
{
return GridItem[name];
}
else
return null;
}
//删除字典里的信息
public static void DeleteItem(string name)
{
if(GridItem.ContainsKey(name))
{
GridItem.Remove(name);
}
}
}
二,用于更新背包信息的脚本ItemUI,添加给新的一个image下的text,并赋值。该image用于显示物品,设置为预制体。
public class ItemUI : MonoBehaviour {
public Text ItemText;
public void UpdateText(string name)
{
ItemText.text = name;
}
}
再创建一个脚本KnapscakManager给Knapscak,用于管理整个背包系统。
public class KnapscakManager : MonoBehaviour {
public Dictionary<int, Item> ItemList;
public KnapscakUI knapscakUI;
//单例模式
public static KnapscakManager Instace{get{return _instace;}}
private static KnapscakManager _instace;
private void Awake()
{
_instace=this;
}
//定义一个创建网格,网格附有物品信息,将其放着Grid下
public void StoreItem(int itemId)
{
if(!ItemList.ContainsKey(itemId)
return;
else
{
Transform EmptyGrid=knapscakUI.GetEmptyGrid();
if(!EmptyGrid)
return;
Item temp =ItemList[itemId]
this.CreateItem(temp,EmptyGrid);
}
private void CreateItem(Item item,Transform emptyGrid)
{
//实例化物品
GameObject ItemPrefab =Resources.Load<GameObject>("Prefabs/Item");
ItemPrefab.GetComponent<ItemUI>().UpdateText(item.Name);
GameObject ItemGo=GameObjec.Instantiate(ItemPrefab);
//设置位置到Grid下,设置成子物体,大小位置相同
ItemGo.transform.SetParent(emptyGrid);
ItemGo.transform.localPosition = Vector3.zero;
ItemGo.transform.localScale = Vector3.one;
ItemModel.StoreItem(emptyGrid.name, item);
}
编写后,应将Asset下面新建一个Resources文件,将Prefabs文件拖入成为子文件夹,利用动态加载生成Item。
到此已经有了显示物品文本,创建物品文本,和存储物品文本。所以在KnapscakManager加一个数据的初始化函数即可,记得在Awake函数中调用。
private void LoadData()
{
ItemList = new Dictionary<int, Item>();
Weapon w1 = new Weapon(0, "手枪","热兵器", 60);
Weapon w2 = new Weapon(1, "宝剑","冷兵器",90);
ItemList.Add(w1.ID, w1);
ItemList.Add(w2.ID, w2);
}
在Camera添加一个InputControl脚本,用于点击生成物品格子。
void Update () {
if(Input.GetMouseButtonDown(2))
{
int index = Random.Range(0, 2);//其中的随机数取决于数据量。
KnapscakManager.Instace.StoreItem(index);
}
}
到此,应该就可以得到点击鼠标中键,背包中生成一个物品。但还缺少显示和拖拽功能。