版权声明:原创笔记 ----黑暗灵魂 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、