介绍
作为一个物品管理,这里提供的方法是:先创建一个.txt文档用来储存所有物品信息。所以当我们要进行管理时候第一步也将是获取到这个文档(用TextAsset类),之后读取并做相关操作。在这里我假设我们的物品有:
注意:
(1)这里的文本文档的编码格式要为UTF-8,否则u3d读取不到内容。设置方法为——文件->另存为->编码
![最下面一行有编码选择](https://img-blog.csdn.net/20171105202240491?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTNkXzIwMTcxMDMw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
每一行代表一件物品,这里我只写了药水的。每一行的第一列(以逗号来分列,注意这里的逗号是英文格式的逗号)
(1)在第一行中,第一列为物品的id,为什么是1001呢?在这里我将物品中的药品id全部设置为一零零几的。
(2)下一列为物品名称,将会显示在游戏中。
(3)第三列为图片名称,这里的图片名称必须是asset里面存在的图片的名称,用这个名称可以找到相应的图片,显示在游戏中。
(4)第四列为物品的类型,在第一幅图中我给不同的类型准备了相应的名称,顾名思义Drug是药品类
(5)回复hp的值,就是可以回复多少的hp
(6)回复mp的值
(7)出售价格
(8)购买价格
在u3d中可以直接将txt文本文件拖入
//获取物理txt文件
public TextAsset objectsInfoListText;
由于物品具有不同的类型,不同类型的物品又有不同的属性,比如药品就有回复血量的属性,而装备没有,所以创建以下类,来暂存不同的物品,之所以说是暂存,是因为最终我们要将要品存在字典中,后面会讲到……
//定义一个枚举类型来存储物品的类型名称
public enum ObjectType
{
Drug,//药品
Equip,//装备
Mat//材料
}
//表示所有物品共有的信息
public class ObjectInfo
{
public ObjectType type;
public int id;
public string name;
public string icon_name;
public int price_sell;
public int price_buy;
}
//表示一条药品信息
public class ObjectInfo_Drug:ObjectInfo
{
public int hp;
public int mp;
}
//表示一条装备的信息
public class ObjectInfo_Equip:ObjectInfo
{
}
//表示一条材料信息
public class ObjectInfo_Mat:ObjectInfo
{
}
用来储存相关的信息。为什么要用字典来储存呢,原因很简单,方便。字典可以通过id,来获取到相应的信息,所以当游戏需要的时候,就可以很方便地获取到需要的物品信息。
字典类需要引入头文件using System.Collections.Generic;
//创建字典,用来储存所有药品的所有信息,以id为索引
private Dictionary<int,ObjectInfo_Drug> objectInfoDict_Drug=new Dictionary<int,ObjectInfo_Drug>();
//创建字典,用来储存所有装备的所有信息,以id为索引
private Dictionary<int, ObjectInfo_Equip> objectInfoDict_Equip = new Dictionary<int, ObjectInfo_Equip>();
//创建字典,用来储存所有材料的所有信息,以id为索引
private Dictionary<int, ObjectInfo_Mat> objectInfoDict_Mat = new Dictionary<int, ObjectInfo_Mat>();
/// <summary>
/// 用于通过id获取字典中的药品信息
/// </summary>
/// <param name="id">id</param>
/// <returns>药品信息</returns>
public ObjectInfo_Drug GetObjectInfoById_Drug(int id)
{
ObjectInfo_Drug info = null;
objectInfoDict_Drug.TryGetValue(id, out info);
return info;
}
/// <summary>
/// 用于通过id获取字典中的装备信息
/// </summary>
/// <param name="id">id</param>
/// <returns>装备信息</returns>
public ObjectInfo_Equip GetObjectInfoById_Equit(int id)
{
ObjectInfo_Equip info = null;
objectInfoDict_Equip.TryGetValue(id, out info);
return info;
}
/// <summary>
/// 用于通过id获取字典中的材料信息
/// </summary>
/// <param name="id">id</param>
/// <returns>材料信息</returns>
public ObjectInfo_Mat GetObjectInfoId_Mat(int id)
{
ObjectInfo_Mat info = null;
objectInfoDict_Mat.TryGetValue(id, out info);
return info;
}
一切准备就绪,接下来就可以处理文本文档中的信息,然后存在相应的字典中
/// <summary>
/// 处理文本中的物品信息
/// </summary>
void ReadInfo()
{
//读取文本文件的所有字符串
string text = objectsInfoListText.text;
//按照行来获取数据,利用回车来拆分成一行行
string[] strArray = text.Split('\n');
//遍历这个行里面的所有信息,每个逗号隔开一个信息,所以用逗号来拆分
foreach (string str in strArray)
{
string[] proArray = str.Split(',');
int id = int.Parse(proArray[0]);
string name = proArray[1];
string icon_name = proArray[2];
string str_type = proArray[3];
ObjectType type=ObjectType.Drug;//储存物品的类型
//判断是什么类型的物品
switch (str_type)
{
case"Drug":
type = ObjectType.Drug;
break;
case"Equip":
type = ObjectType.Equip;
break;
case"Mat":
type = ObjectType.Mat;
break;
}
//如果该物品是药瓶,则获取它的加血值,加mp值,出售价格,买入价格
if (type == ObjectType.Drug)
{
int hp = int.Parse(proArray[4]);
int mp = int.Parse(proArray[5]);
int price_sell = int.Parse(proArray[6]);
int price_buy = int.Parse(proArray[7]);
//用来储存一件药品的所有信息
ObjectInfo_Drug info_Drug = new ObjectInfo_Drug();
info_Drug.hp = hp;
info_Drug.mp = mp;
info_Drug.id = id;
info_Drug.name = name;
info_Drug.icon_name = icon_name;
info_Drug.price_buy = price_buy;
info_Drug.price_sell = price_sell;
info_Drug.type = type;
//添加到字典中
objectInfoDict_Drug.Add(info_Drug.id, info_Drug);
}
//如果该物品是装备,则获取它的,出售价格,买入价格
if (type == ObjectType.Equip)
{
int price_sell = int.Parse(proArray[6]);
int price_buy = int.Parse(proArray[7]);
//用来存储一件装备的所有信息
ObjectInfo_Equip info_Equip = new ObjectInfo_Equip();
info_Equip.id = id;
info_Equip.name = name;
info_Equip.icon_name = icon_name;
info_Equip.price_buy = price_buy;
info_Equip.price_sell = price_sell;
info_Equip.type = type;
//添加到字典中
objectInfoDict_Equip.Add(info_Equip.id, info_Equip);
}
//如果该物品是材料,则获取它的,出售价格,买入价格
if (type == ObjectType.Mat)
{
int price_sell = int.Parse(proArray[6]);
int price_buy = int.Parse(proArray[7]);
//用来储存一个材料的所有信息
ObjectInfo_Mat info_Mat = new ObjectInfo_Mat();
info_Mat.id = id;
info_Mat.name = name;
info_Mat.icon_name = icon_name;
info_Mat.price_buy = price_buy;
info_Mat.price_sell = price_sell;
info_Mat.type = type;
//添加到字典中
objectInfoDict_Mat.Add(info_Mat.id, info_Mat);
}
}
}
为了验证,可以在Awake();方法中输出一下字典里的东西
print(objectInfoDict_Drug.Keys.Count);//输出储存药品的字典里有多少条信息,我这里是3条
print(objectInfoDict_Equip.Keys.Count);
print(objectInfoDict_Mat.Keys.Count);
上面给出了所有思路,但有一些细节容易搞混大家,所以我直接给全所有的代码以供理解
在我上传了一个C#资源文件里
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。