4.背包系统
由于第一次写文章,而已一来就写这么长篇的系列,所以,茶水最近也很努力学习写作的技巧,发现原来一篇好的文章,不是在乎内容有多细节多详尽,而是,在于如何快速切入主题,直击读者的兴趣点,所以,这篇,茶水不会再贴出过多的代码了,反正最后会全给出的,我会解释每个public的或主要的变量和函数,这样一来可以使排版更整洁,两来大家也不会打瞌睡了,大家有兴趣可以回头研究下代码,留言我们再讨论,这次就先来个试水,如果效果好的话,嘻嘻,你懂的。
好了,现在开始万众期待的背包系统。由于这个背包系统并不是这次系列的主题,可能在设计上有点儿取巧,其实就是懒!但是也并不是一无是处,应该还是能用的。呵呵。。。
背包系统和道具系统一样主要分成两个部分,第一部分就是道具槽,或者道具格,就是存放单个道具的那个东西,第二部分就是管理器(这个东西貌似哪里都需要,呵呵),就是背包了,就是我们今天的重点了。另外有个好消息,今天继续有Editor编程。
=================道具槽=================
道具槽,指定动作,新建C#脚本,重命名 Inventory_Slot,并实现 IComparable<Inventory_Slot> 接口,用于排序。
变量:
item_id 记录道具的ID
current_stack 当前的堆栈数
函数:
Inventory_Slot (int itemID) 构造函数,保证每个slot记录的都是都是有意义的道具,我们歧视无意义的Slot!!
public bool Withdraw() 取出,或移除1个道具,如果事后堆栈数小于等于0,返回true,通知管理器删除这个Slot。
public bool Deposit() 存入,或增加1个道具,如果事前堆栈数到达最大值,则无法存入,返回false,通知管理器。
public bool Full_Stack() 判断当前堆栈数是否达到最大值。
public int CompareTo (Inventory_Slot x) 用于排序用的,这个可以根据实际需要编写。
好了,简单易懂吧,这就是道具槽,道具槽用于管理同一个格子的道具,主要就是管理堆栈数的问题而已。好了,下面开始管理器设计。
=================管理器=================
管理器,制定动作,新建C#脚本,重命名Inventory_Manager。同样,设计成单例模式。
变量:
money 记录玩家的金钱,如有需要,可以添加更多的种类,或类WOW的各种货币。
player_inventory 玩家身上的背包。
store_inventory 仓库。
shop_inventory 商店,这样设计其实是不对的,这里主要为了测试方便而设计的。
[size=13.63636302948px]player_inventory_limit,store_inventory_limit,shop_inventory_limit 背包的道具槽上限。
角色装备的ID,如果只要一个主角的话,可以将其设计成单例,所以一同写进管理器。 #region Equipment public int equipmentID_Main_Weapon = -1, equipmentID_Second_Weapon = -1, equipmentID_Shield = -1, equipmentID_Head = -1, equipmentID_Shoulder = -1, equipmentID_Belt = -1; // add more equipment here ... #endregion
背包种类的枚举,这个地方就是我所说的取巧的地方了,详细可以翻看代码。 enum Inventory_Type { Player, Store, Shop } ;
函数:
public static Inventory_Manager Get_Manager() 这个方法同道具管理器的一样,获取管理器的实例。
public bool Deposit(int itemID, Inventory_Type type) 存入道具,道具ID,目标背包(玩家,仓库,商店),若目标背包堆栈达到上线,存入失败,返回false。
public bool Withdraw(int itemID, Inventory_Type type) 取出道具,道具ID,和源背包(从哪个背包里取出),查无此道具则取出失败,返回false。
public bool Withdraw_at_slot(int slotID, Inventory_Type type) 从指定道具槽取出道具,槽ID,源背包,槽不存在则返回false。
public int Get_Current_Stack(int slotID, Inventory_Type type) 获取当前道具槽的堆栈数,槽ID,源背包。
public void Sort(Inventory_Type type) 目标背包的道具重新排序。
管理器代码部分完成,好了,返回到Scene,新建空GameObject,重命名Inventory_Manager和tag改名为Inventory Manager。
保存成prefabs,然后千万不要忘记上篇的那个伟大的Global_Manager,将背包的prefabs拖到Global_Manager的正确位置,
好了,伟大的背包系统设计好了,一如既往,奖励部分,这次提供的一个测试单元,用于测试目前的背包系统和道具系统相结合的一个简单单元。
=================测试单元=================
新建C#脚本,重命名为Unit_Inventory_Manager, 变量:
int itemID 要测试的道具ID
public Inventory_Manager.Inventory_Type inventory_type 要测试的目标背包(玩家,仓库,商店)
Item_Profile itemInfo 道具信息,这个不需要赋值,这个根据所测试的道具ID,系统会自动复制,只要用于快速定位目标道具而已,方便在Project视图中定位而已,可无视之。
函数:
public void Deposit() 向目标背包存在测试道具。
public void Withdraw() 从目标背包取出测试道具。
public void Show_Info() 显示/更新要测试的道具的Item_Profile文件。
然后将此脚本挂在到Inventory_Manager对象下,然后配合茶水给出的Unit_Inventory_Manager_Editor(不需要挂载在任何地方,让他静静的呆在文件夹里就好了),如效果图。点击运行,然后点击Unit XXX的按钮,看看背包里的数据,我们的背包和道具系统能正常互动了!!好也!
======================================
好了,道具系统的核心部分的设计全部完成了。下篇开始就要开始万众期待的UI设计了,这将会是个漫长而痛苦的过程,先上个图吓唬吓唬你们,
|