内容简介:存储部分不负责UI显示,也不处理“鼠标点击拿取物品”这样的UI逻辑,只需要接收UI改变事件并响应。注:这篇文章下面的所有“格子”都代表存储部分数组中的一个位置,不是UI显示上的格子为了在UI和存储部分间互发信息,要有描述背包存储区物品变化的事件类,就像是个信封,里面装着用来描述变化的信息
unity3d制作背包系统(2)–存储部分
存储部分不负责UI显示,也不处理“鼠标点击拿取物品”这样的UI逻辑,只需要接收UI改变事件并响应。
注:这篇文章下面的所有“格子”都代表存储部分数组中的一个位置,不是UI显示上的格子
相关事件类
为了在UI和存储部分间互发信息,要有描述背包存储区物品变化的事件类,就像是个信封,里面装着用来描述变化的信息
public class backpackevent {
public int id = 0;//slotbutton的id,或buttpress的ID
public float process = 0;
public beventtype type;
public bool isnumchange = false;
public itemunit item;//格子中的物品
public backpackevent()
{
id = 0;
type = beventtype.slotchange;
}
}
public enum beventtype//背包改变事件类型
{
slotchange,processdone,interect
}
定义存储部分的物品改变事件
public delegate void backpackchange(backpackevent bevent);
存储部分的成员变量
背包必须有个能存储物品的地方,这里用数组存储物品:
以及发送事件的event
public class backpackbase : MonoBehaviour {
public itemunit[] backpack = new itemunit[9];//大小可调,视具体需要而定
public event backpackchange bchangeevent;//背包物品改变事件
backpackevent bevent=new backpackevent();//事件类
}
需要的方法
首先是发送背包改变事件的方法 事件发送方法
protected void changeevent(itemunit item,int id,bool isnumchange=false)
{
bevent.item=item;
bevent.id=id;
bevent.type=beventtype.slotchange;//事件类型为“格子改变”
bevent.isnumchange=isnumchange;//暂时用不到的变量,意为“是否该格子内的物品只是数量改变”
if(bchangeevent!=null)bchangeevent(bevent);
}
存储部分为了实现响应UI变化,需要有一个接收UI事件类的
响应方法
(uievent将在UI部分定义)
public virtual void uionchange(uievent even)//ui有改变时触发
{
switch(even.type)
{
case uieventtype.slotchange://是格子改变类型的事件时
backpack[even.id] = even.item;
changeevent(backpack[even.id], even.id,false);
break;
default:
break;
}
}
当玩家要消耗某种物品的时候要从背包里扣除相应物品,因此有
扣除方法
public virtual void subitem(itemunit item)//从背包中扣除相应物品
{
bool succ = false;
int temp = item.num;
for (int p = 0; p < backpack.Length; p++)//遍历背包存储区
{
if (item.equal(backpack[p]))//如果遇到同种物品
{
int changed = temp;//标记是否改变了背包
temp = backpack[p].subnum(temp);//减少p位置的物品的数量
if (temp == changed) { }//判断是否改变该格背包
else//如果改变了
{
changeevent(backpack[p], p, !(backpack[p].isempty()));//发送背包改变事件
}
if (temp > 0) { continue; }
else { succ = true; break; }//东西够减
}
}
}
当玩家得到了什么物品时,需要一个
添加方法
(该函数先寻找同种物品并叠加上去,如果放不下再找空格子放)
public virtual int additem(itemunit item)//给背包添加物品
{
bool succ = false;
int temp = item.num;
for (int p = 0; p < backpack.Length; p++)//第一趟遍历,找相同物品并堆叠在一起
{
if (item.equal(backpack[p]))//如果遇到同种物品
{
int beforechange = backpack[p].num;
int changed = temp;//标记是否改变了背包
temp = backpack[p].addnum(temp);//增加p位置的物品的数量
if (temp != changed)
{
changeevent(backpack[p], p, !(beforechange == 0));
}//如果添加该格背包成功则发送改变事件
if (temp > 0) { continue; }
else { succ = true; break; }//放得下
}
}
if (!succ)//如果第一趟遍历到相同物品不够放
{
for (int i = 0; i < backpack.Length; i++)//第二次遍历寻找空的格子
{
if (backpack[i].isempty())//如果遇到空位
{
backpack[i] = item;//此时已添加到backpack[]里
changeevent(backpack[i], i,false);//该格背包已被更改false代表不是“仅数量改变”
if (backpack[i].isoverflow() > 0)//超出最大堆叠的数量
{
temp = backpack[i].isoverflow();
backpack[i].tomax();//设置为满的物品
}
else
{
temp = 0;
}
if (temp > 0) { continue; }
else { succ = true; break; }
}
}
return temp;//不成功返回超出的数量
}
else return 0;
}
给其他脚本用来监听存储改变事件的监听方法
public void listen(backpackchange chaf)
{
bchangeevent += chaf;
}
存储部分完整代码:
public class backpackbase : MonoBehaviour {
public itemunit[] backpack = new itemunit[9];//大小可调,视具体需要而定
public event backpackchange bchangeevent;//背包物品改变事件
backpackevent bevent=new backpackevent();//事件类
protected void changeevent(itemunit item,int id,bool isnumchange=false)
{
bevent.item=item;
bevent.id=id;
bevent.type=beventtype.slotchange;//事件类型为“格子改变”
bevent.isnumchange=isnumchange;//暂时用不到的变量,意为“是否该格子内的物品只是数量改变”
if(bchangeevent!=null)bchangeevent(bevent);
}
public virtual void uionchange(uievent even)//ui有改变时触发
{
switch(even.type)
{
case uieventtype.slotchange://是格子改变类型的事件时
backpack[even.id] = even.item;
changeevent(backpack[even.id], even.id,false);
break;
default:
break;
}
}
public virtual void subitem(itemunit item)//从背包中扣除相应物品
{
bool succ = false;
int temp = item.num;
for (int p = 0; p < backpack.Length; p++)//遍历背包存储区
{
if (item.equal(backpack[p]))//如果遇到同种物品
{
int changed = temp;//标记是否改变了背包
temp = backpack[p].subnum(temp);//减少p位置的物品的数量
if (temp == changed) { }//判断是否改变该格背包
else//如果改变了
{
changeevent(backpack[p], p, !(backpack[p].isempty()));//发送背包改变事件
}
if (temp > 0) { continue; }
else { succ = true; break; }//东西够减
}
}
}
public virtual int additem(itemunit item)//给背包添加物品
{
bool succ = false;
int temp = item.num;
for (int p = 0; p < backpack.Length; p++)//第一趟遍历,找相同物品并堆叠在一起
{
if (item.equal(backpack[p]))//如果遇到同种物品
{
int beforechange = backpack[p].num;
int changed = temp;//标记是否改变了背包
temp = backpack[p].addnum(temp);//增加p位置的物品的数量
if (temp != changed)
{
changeevent(backpack[p], p, !(beforechange == 0));
}//如果添加该格背包成功则发送改变事件
if (temp > 0) { continue; }
else { succ = true; break; }//放得下
}
}
if (!succ)//如果第一趟遍历到相同物品不够放
{
for (int i = 0; i < backpack.Length; i++)//第二次遍历寻找空的格子
{
if (backpack[i].isempty())//如果遇到空位
{
backpack[i] = item;//此时已添加到backpack[]里
changeevent(backpack[i], i,false);//该格背包已被更改false代表不是“仅数量改变”
if (backpack[i].isoverflow() > 0)//超出最大堆叠的数量
{
temp = backpack[i].isoverflow();
backpack[i].tomax();//设置为满的物品
}
else
{
temp = 0;
}
if (temp > 0) { continue; }
else { succ = true; break; }
}
}
return temp;//不成功返回超出的数量
}
else return 0;
}
public void listen(backpackchange chaf)
{
bchangeevent += chaf;
}
}
背包系统的其他笔记
[下一篇:UI类]
文章正在完善中,如有错误或不合理的地方还请谅解
以上所述就是小编给大家介绍的《unity3d制作背包系统(2)--存储部分》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
大数据架构商业之路
黄申 / 机械工业出版社 / 2016-5-1 / 69.00元
目前大数据技术已经日趋成熟,但是业界发现与大数据相关的产品设计和研发仍然非常困难,技术、产品和商业的结合度还远远不够。这主要是因为大数据涉及范围广、技术含量高、更新换代快,门槛也比其他大多数IT行业更高。人们要么使用昂贵的商业解决方案,要么花费巨大的精力摸索。本书通过一个虚拟的互联网O2O创业故事,来逐步展开介绍创业各个阶段可能遇到的大数据课题、业务需求,以及相对应的技术方案,甚至是实践解析;让读......一起来看看 《大数据架构商业之路》 这本书的介绍吧!