Unity3D背包系统制作 第01篇

版权声明:原创笔记 ----黑暗灵魂 https://blog.csdn.net/qq_38843118/article/details/84649409

一、编辑背包物品的数据类

一般来说,背包中的物品有编号,物品名字,物品的描述,背包格子容量(也就是一个背包格子中最多可以放几个这种物品),物品的品质(普通,稀有,传说什么的),物品的类型(道具,装备,任务用品,材料等等),物品价格,至于物品的图片如何显示在格子中,有两种加载图片的方式,一个是直接加载2D图片,另一个根据Unity中Resources文件夹的功能,将图片放在Resources文件夹中,记录下图片在Resources中的保存路径,在代码中加载。

//物品的数据类
public class Item
{
    public int Id { get; private set; }                   //编号
    public string Name { get; private set; }              //名字
    public string Description { get; private set; }       //描述

    public int Capacity { get; set; }           //背包格子容量
    public ItemQuality Quality { get; set; }    //品质
    public ItemType Type { get; set; }          //类型
    public int Price { get; set; }              //价格

    public Sprite Icon_pic { get; set; }        //Icon图片
    public string Icon_str { get; set; }        //Icon图片路径

    //构造函数
    public Item(int id, string name, string description)
    {
        this.Id = id;
        this.Name = name;
        this.Description = description;
        this.Capacity = 1;
        this.Quality = ItemQuality.White;
        this.Type = ItemType.Other;
        this.Price = 0;
        this.Icon_pic = null;
        this.Icon_str = null;
    }
}

 上面用到两个枚举类型,物品的品质,物品的类型。

//物品质量
public enum ItemQuality
{
    Gray,   //灰色
    White,  //白色
    Green,  //绿色
    Blue,   //蓝色
    Purple, //紫色
    Orange, //橙色
    Yellow, //黄色
    Red,    //红色
    Black   //黑色
}

//物品类型
public enum ItemType
{
    Equip,      //装备
    Consumable, //道具
    Material,   //材料
    Task,       //任务用品
    Other
}

就这样,物品的基类就完成了。

物品中有装备,装备可以增加角色的攻击防御,但是攻击防御这些属性怎么添加到类中呢?

以物品基类(Item)为父类,创建装备类(ItemEquip),新添一下装备特有的属性。

//装备类型
public enum EquipType
{
    Weapon, //武器
    Head,   //头部
    Body,   //上衣
    Leg,    //腿部
    Foot,   //足部
    Wrist,  //腕部
    Knee,   //膝盖
    Hand,   //手部
    Shoulder//肩膀
}
//装备
public class ItemEquip : Item
{
    public EquipType EquipType { get; set; }    //装备类型

    public int Attack { get; set; }     //装备的攻击力
    public int Defence { get; set; }    //装备的防御力
    public int Speed { get; set; }      //装备增加主角的速度

    //构造函数
    public ItemEquip(int id, string name, string description)
        : base(id, name, description)
    { }
}

同样还有道具类

//道具
public class ItemConsumable : Item
{
    //构造函数
    public ItemConsumable(int id, string name, string description)
        : base(id, name, description)
    { }

    public int Hp { get; set; }         //使用后增加角色的血量
    public int Mp { get; set; }         //使用后增加角色的魔法
}

至此,物品的数据类编辑完毕。


二、用Json解析数据

1、编写Json数据

[
	{
		"id":1001,
		"name":"补血剂",
		"des":"高科技产品,有快速补血的功能。",
		"capacity":99,
		"quality":"Green",
		"type":"Consumable",
		"price":10,
		"icon":"xconsum_drug01",
		"hp":80,
		"mp":0
	},
	{
		"id":2001,
		"name":"头盔",
		"des":"高级铁匠制作,保护头部。",
		"capacity":1,
		"quality":"Blue",
		"type":"Equip",
		"price":80,
		"icon":"xequip_head01",
		"equiptype":"Head",
		"atk":12,
		"def":16,
		"spd":10
	},
	{
		"id":3001,
		"name":"头盔制作书",
		"des":"记录了头盔的制作过程。",
		"capacity":99,
		"quality":"Blue",
		"type":"Material",
		"price":80,
		"icon":"xmat_book01"
	}
]

2、解析Json数据(下载LitJson插件 http://www.json.org/)

把下载到的LitJson.dll插件放到Unity工程Plugins文件夹中,新建脚本InventoryMgr,引入LitJson命名空间,开始解析

using System.Collections.Generic;
using UnityEngine;
using LitJson;

public class InventoryMgr
{
    //解析Json文件将得到的物品数据放入一个List集合中(json数据,图标文件夹)
    public static List<Item> ParseItem(string json, string iconFolder)
    {
        List<Item> itemList = new List<Item>();                 //新建一个List
        JsonData jsonList = JsonMapper.ToObject(json);
        jsonList.SetJsonType(JsonType.Array);

        foreach (JsonData temp in jsonList)
        {
            //开始解析一条物品数据
            int id = int.Parse(temp["id"].ToString());      //物品编号
            string name = temp["name"].ToString();          //物品名称
            string des = temp["des"].ToString();            //物品描述

            //物品类型
            ItemType type = (ItemType)System.Enum.Parse(typeof(ItemType), temp["type"].ToString());

            //新建一个空的物品数据
            Item item = null;

            //根据类型进行构造对象
            if (type == ItemType.Equip) item = new ItemEquip(id, name, des);
            else if (type == ItemType.Consumable) item = new ItemConsumable(id, name, des);
            else item = new Item(id, name, des);

            //设置物品的共有属性
            item.Type = type;
            item.Capacity = int.Parse(temp["capacity"].ToString());
            item.Quality = (ItemQuality)System.Enum.Parse(typeof(ItemQuality), temp["quality"].ToString());
            item.Price = int.Parse(temp["price"].ToString());
            item.Icon_str = iconFolder + "/" + temp["icon"].ToString();

            //根据物品类型设置物品的特殊属性
            if (type == ItemType.Equip)
            {
                ((ItemEquip)item).EquipType = (EquipType)System.Enum.Parse(typeof(EquipType), temp["equiptype"].ToString());
                ((ItemEquip)item).Attack = int.Parse(temp["atk"].ToString());
                ((ItemEquip)item).Defence = int.Parse(temp["def"].ToString());
                ((ItemEquip)item).Speed = int.Parse(temp["spd"].ToString());
            }
            else if (type == ItemType.Consumable)
            {
                ((ItemConsumable)item).Hp = int.Parse(temp["hp"].ToString());
                ((ItemConsumable)item).Mp = int.Parse(temp["mp"].ToString());
            }
            //将物品数据添加到集合中
            itemList.Add(item);
            //输出Item, 检验Item是否解析正确
            OnOutput(item);
        }

        Debug.Log("物品数据解析完成,共" + itemList.Count + "条");
        return itemList;
    }

    //输出Item, 检验Item是否解析正确
    public static void OnOutput(Item item)
    {
        if (item == null) return;
        string s = " 编号:" + item.Id;
        s += "\n 名称:" + item.Name;
        s += "\n 描述:" + item.Description;
        s += "\n 类型:" + item.Type;
        s += "\n 容量:" + item.Capacity;
        s += "\n 品质:" + item.Quality;
        s += "\n 价格:" + item.Price;
        s += "\n 路径:" + item.Icon_str;
        s += "\n 图片:" + item.Icon_pic;
        if (item.Type == ItemType.Consumable)
        {
            s += "\n 加血:" + ((ItemConsumable)item).Hp;
            s += "\n 加魔:" + ((ItemConsumable)item).Mp;
        }
        else  if(item.Type  == ItemType.Equip)
        {
            s += "\n 攻击:" + ((ItemEquip)item).Attack;
            s += "\n 防御:" + ((ItemEquip)item).Defence;
            s += "\n 速度:" + ((ItemEquip)item).Speed;
        }
        Debug.Log(s);
    }
}

3、将InventoryMgr脚本完善:定义一个物品集合,初始化时将解析出来的数据放入这个集合,之后可以从这个集合中取数据

//物品数据的管理类
public class InventoryMgr
{
    //单例模式
    private static InventoryMgr _instance;
    public static InventoryMgr Instance
    {
        get
        {
            if (_instance == null)
                _instance = new InventoryMgr();
            return _instance;
        }
    }
    private InventoryMgr()
    {
        itemList = new List<Item>();
    }
    //物品集合
    public List<Item> itemList;
    //根据物品编号 从集合中 获取Item信息
    public Item GetItem(int id)
    {
        foreach (Item item in itemList)
            if (item.Id == id)
                return item;
        return null;
    }
}

4、新建脚本,编辑代码,进行初始化操作:解析数据,存入管理类InventoryMgr中的物品集合中

public class SimpleInit : MonoBehaviour
{
    public static SimpleInit Instance;
    private void Awake()
    {
        Instance = this;
        //初始化背包系统的物品数据
        string json = Resources.Load<TextAsset>("Text/RpgItem").text;   //从Resources文件夹中获取Json文件
        InventoryMgr.Instance.itemList = new List<Item>(InventoryMgr.ParseItem(json, "ItemIcon"));  //将数据写入集合
    }
}

5、运行工程,执行初始化方法,检查输出,观察物品是否解析正确

物品解析后输出


三、搭建UI,实现背包的存储功能

1、

猜你喜欢

转载自blog.csdn.net/qq_38843118/article/details/84649409
今日推荐