背包系统的完善(一) 背包系统的分割和实现

来源:互联网 发布:程序员办公室图 编辑:程序博客网 时间:2024/06/05 14:44

由于上一周对于游戏的一些具体功能进行了讨论,所以本人就之前的背包系统设计进行了修改。


整体来说,相较于之前的背包系统,该背包系统运行起来更流畅,也解决了前一个背包系统在拖动物体时帧率变低的问题。


新的背包系统包括:

1、一个用于表示背包系统的按钮:


该按钮上添加了EventListener事件,该事件经过改写,可用于实现点击一次展示,点击第二次消失的效果。

代码比较简单,主要是在EventListener本身的事件代码上进行了一定的修改:

public GameObject item;public GameObject tip;public int count = 0;

其中Item用于表示监听的物体,tip表示受到监听后发生动作的物体,count用于计数,以便于实现点击两次后tip物体消失的效果。

具体的点击代码如下所示,比较简单,不再进行解释:

 void ButtonClick(GameObject button)    {        count++;        if(count==1)        tip.SetActive(true);        if (count == 2) {            tip.SetActive(false);            count = 0;        }

2、物品的显示:

因为此处涉及到与后台端数据的传输,所以我在这里暂且先将物品的信息用一个TXT文件保存起来:


这些信息分别对应 物品的id 物品的名称 物品的图片表示 (暂且需要这么多,更多的信息以后丰富内容的时候进行添加)

为了读取TXT文件中物品的信息,我们需要创建一个空物体,并在该物体上挂上读取的脚本:

我们需要把TXT的文件读取到一个String中,根据‘\n’和‘,’来分割字符串,取得相应的物品信息,保存到之后我们需要在点击物品是显示的Dictionary中去。

具体代码如下,比较简单:

using UnityEngine;using System.Collections;using System.Collections.Generic;public class ObjectsInfo : MonoBehaviour{    public static ObjectsInfo _instance;    public TextAsset objectsInfoListText;    private Dictionary<int, ObjectInfo> objectInfoDictionary =        new Dictionary<int, ObjectInfo>();    void Awake()    {        _instance = this;        ReadInfo();    }    public ObjectInfo GetObjectInfoById(int key)    {        ObjectInfo info = new ObjectInfo();        objectInfoDictionary.TryGetValue(key, out info);        return info;    }    private void ReadInfo()    {        string text = objectsInfoListText.text;        string[] strArray = text.Split('\n');        foreach (string str in strArray)        {            string[] proArray = str.Split(',');            ObjectInfo info = new ObjectInfo();            int id = int.Parse(proArray[0]);            string name = proArray[1];            string iconName = proArray[2];            string typeStr = proArray[3];            info.id = id;            info.name = name;            info.iconName = iconName;            //添加到字典上,id为key,方便根据id查找            objectInfoDictionary.Add(id, info);        }    }}//id,名称,icon名称,类型public class ObjectInfo{    public int id;    public string name;    public string iconName;}


要让背包内的物品正确显示出来,还需要对物品添加一个SetId的方法,对于每个物品来说,id对应的图片是不同的,最后进行使用时对应的效果也是不同的。

 public void SetId(int id)    {        ObjectInfo info = ObjectsInfo._instance.GetObjectInfoById(id);        sprite.spriteName = info.iconName;        this.id = id;    }


除此之外,物品和其他不同,还需要相应拖拽事件,这里比较简单,为物品添加一个 Box Collider,然后让物品对应的脚本继承于Unity原生的拖拽事件即可。

3、一个用于表示背包的Sprite:




加入一个Sprite,然后对Sprite进行图片添加的操作。

此处需要注意的是,如果在NGUI中想要添加自己的图片背景,和在Unity原生的添加是不一样的。此处需要自己创建一个图集Atlas。

点选你需要的图片,点击右键,选择NGUI->Open Atlas Maker,会弹出以下对话框:


加入你需要的图片后点击画面中的“添加/更新”按钮即可。这样可以被用于Sprite组件的属于你自己的图集就建立好了。之后只需要在对应的Sprite组件的 UI Sprite面板中,点击Atlas,选择图集,在点击Sprite,就可以了。


4、背包中的格子Cell:


首先分析一下,可以发现,背包需要一个Sprite,但背包中还有许多网格,所以在背包中创建一系列的Sprite,用于表示物品存放的格子。如图中的Cell。


为了方便起见,这里可以将Cell进行Prefab的处理。

所谓的Prefab,就是将一个你自己定义好的资源打包,以便下次使用的时候,可以直接从资源文件里拖出来使用。有点类似于图形学里的显示列表(不知道这么比喻对不对)。

操作也非常简单,对你需要进行Prefab处理的资源点击右键,选择Create -> Prefab即可。


因为背包系统中,背包本身面板需要存放一些Cell,也就格子,格子中再存放物体。所以对于背包面板来说,需要对格子Cell进行管理。需要创建一个List用于存放格子。为了方便格子的管理,最好在面板中给格子进行编号,如图,从Cell01开始编号。




格子还需要对物体有一定的管理作用,在格子中定义变量id为物品的编号,num为物品的数量,添加一个Label用于在物品的右下角显示该物品的数量。


using UnityEngine;
using System.Collections;
    public class InventoryItemGrid : MonoBehaviour {        public int id = 0;      public int num = 0;      private ObjectInfo info = null;      private UILabel numLabel;      void Start()     {         numLabel = this.GetComponentInChildren<UILabel>();     }      public void SetId(int id, int num = 1)     {         this.id = id;         info = ObjectsInfo._instance.GetObjectInfoById(id);         InventoryItem item = this.GetComponentInChildren<InventoryItem>();                this.num = num;         numLabel.text = this.num.ToString();         numLabel.enabled = true;          item.SetId(id);    }      public void PlusNum(int num = 1)     {         this.num += num;         numLabel.text = this.num.ToString();     }     public void ClearInfo()     {        id = 0;         num = 0;         info = null;         numLabel.enabled = false;     } }


至此我们对背包系统进行了拆分,分成了按钮、物品、背包面板和格子几部分。并初步实现了每一部分的功能,下面我们将要把这些分离开的功能整合到一起,实现一个完整的背包系统。


原创粉丝点击