Unity3d学习记录之背包系统(一)

本系列为学习记录,作为学习他人传播的知识,为方便自我总结,侵删。

学习来源: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);
            
        }
	}

到此,应该就可以得到点击鼠标中键,背包中生成一个物品。但还缺少显示和拖拽功能。

猜你喜欢

转载自blog.csdn.net/leanerU/article/details/82721736