unity背包系统(摘抄)
Posted hpu001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity背包系统(摘抄)相关的知识,希望对你有一定的参考价值。
新的背包系统包括:
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中,根据‘ ’和‘,’来分割字符串,取得相应的物品信息,保存到之后我们需要在点击物品是显示的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(‘
‘);
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;
}
}
至此我们对背包系统进行了拆分,分成了按钮、物品、背包面板和格子几部分。并初步实现了每一部分的功能,下面我们将要把这些分离开的功能整合到一起,实现一个完整的背包系统。
---------------------
作者:okurusT
来源:CSDN
原文:https://blog.csdn.net/zxycs1996/article/details/72995868
版权声明:本文为博主原创文章,转载请附上博文链接!
以上是关于unity背包系统(摘抄)的主要内容,如果未能解决你的问题,请参考以下文章
Unity UGUI有趣应用 -------------------- 背包系统(上)之简易单页背包系统及检索功能的实现