Unity之背包系统(一):物品类的生成和背包的制作

物品的UML类图

创建Item 物品基类:

再开发它的消耗品类、装备类、武器类

接着,设计消耗品类的JSON文件:http://www.bejson.com/jsoneditoronline/

创建一个物品管理类做成单例模式,将脚本放在“InventoryManager”(场景中新建的GameObject)中 :

然后用JsonObject解析Json,unity商城Asset Store里有,并将其存入List<Item>中

    private void Awake()
    {
        ParseItemsJSON();
    }

    /// <summary>
    /// 解析JSON
    /// </summary>
    private void ParseItemsJSON()
    {
        itemList = new List<Item>();
        TextAsset ta = Resources.Load<TextAsset>("items");
        JSONObject j = new JSONObject(ta.text);

        foreach (JSONObject temp in j.list)
        {
            string itemType = temp["type"].str;
            Item.ItemType type = 
(Item.ItemType)System.Enum.Parse(typeof(Item.ItemType), itemType);
            int id = (int)temp["id"].n;  //公用物品解析
            string name = temp["name"].str;
            //string Quality = temp["quality"].str;
            Item.ItemQuality quality = 
            (Item.ItemQuality)System.Enum.Parse(typeof(Item.ItemQuality), temp["quality"].str);
            string description = temp["description"].str;
            int capacity = (int)(temp["capacity"].n);
            int buyPrice = (int)(temp["buyPrice"].n);
            int sellPrice = (int)(temp["sellPrice"].n);
            string sprite = temp["sprite"].str;

            Item item = null;
            switch (type)
            {
                case Item.ItemType.Consumable:
                    int hp = (int)temp["hp"].n;
                    int mp = (int)temp["mp"].n;
                    item = new Consumable
                       (id, name, type, quality, description, capacity, buyPrice, sellPrice, sprite, hp, mp);
                    break;
                case Item.ItemType.Equipment:
                    break;
                case Item.ItemType.Weapon:
                    break;
                case Item.ItemType.Material:
                    break;
            }
            itemList.Add(item);
            Debug.Log(item);
        }
    }

 

 

 

设计一个背包,使用Grid Layout Group对Slot(物品槽,可添加Button组件使其有拿取的动画效果)进行排版(可对不交互的UI取消射线交互的勾选项)

创建一个Item:放置物品图片和数量,将Item和Slot做成预制体,并给Item、Slot、Knapsack添加对应脚本

创建一个Inventory类,让Knapsack继承与它;

15)Inventory类中,创建一个Slot(物品槽)类的数组,Start时获取Slot身上的Slot脚本;

申明一个存储物品方法(需在Inventory中写一个获取Item的ID的方法),参数为Item,

当Item的容量为1时:申明一个找空物品槽Slot 的方法(foreach遍历Slot的子物体是否为0),

若有空物品槽(先在Slot中写入储存物品的方法),则调用Slot中储存物品的方法;

当Item的容量不为1时:先申明一个找相同类型物品槽的方法(参数为Item,返回值类型为Slot),用foreach遍历Slot的子物体,当

slot的子物体大等于1 且 容量还没满 且 类型 相同 ,返回当前slot。当容量不为1时,若slot不为空,则调用Slot类中的存储方法,若为空,则调用容量为1的方法。

Slot中储存物品的方法:把Item放在自身下面,如果自身一下已经有Item了,amount++,
    如果没有,根据ItemPrefab 去实例化一个Item,放在下面

Slot类:

ItemUI类:

 

更新ItemUI的UI显示:

 

 

将Knapsack做成单例类

创建一个空节点,挂上一个脚本进行测试:

 

 

  • 19
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值