背包系统的完善(一) 背包系统的分割和实现
来源:互联网 发布:程序员办公室图 编辑:程序博客网 时间: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; }
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; } }
至此我们对背包系统进行了拆分,分成了按钮、物品、背包面板和格子几部分。并初步实现了每一部分的功能,下面我们将要把这些分离开的功能整合到一起,实现一个完整的背包系统。
- 背包系统的完善(一) 背包系统的分割和实现
- 背包系统(一)
- 背包系统的制作
- NGUI简单背包系统的实现
- 背包系统(二)各个部分的整合和整体功能的实现
- UGUI的背包系统(上)
- NGUI实现背包系统
- 【Unity】基于MVC模式的背包系统 UGUI实现
- 【Unity】NGUI背包系统——背包整理按钮的实现
- 背包系统(二)
- 背包系统
- 背包系统
- 背包系统
- 基于Unity3D(UGUI)的背包系统(装备系统,锻造系统,购买系统)
- NGUI 背包系统的拖拽
- NGUI 背包系统的拖拽
- 【Unity&NGUI】背包系统崩溃的解决办法
- 【Unity&NGUI】背包系统物品的累加
- extjs 布局 -列布局 column
- 添加基本组件
- 在pycharm2017 上实现python3.6与mysql数据库的连接
- javascript 原型方法,对象方法,类方法;私有属性,公有属性,公有静态属性
- Kotlin基本语法
- 背包系统的完善(一) 背包系统的分割和实现
- bzoj 1913 signaling 信号覆盖 (极角排序 组合数)
- const的用法及部分面试题解析
- JAndFix: 基于Java实现的Android实时热修复方案
- 延迟绑定
- 内核态(内核空间)和用户态(用户空间)的区别和联系
- VS Code配置Matlab环境
- java中接口类似c++中纯虚函数
- E