u3d_rpg游戏开发之物品管理(一)


介绍
作为一个物品管理,这里提供的方法是:先创建一个.txt文档用来储存所有物品信息。所以当我们要进行管理时候第一步也将是获取到这个文档(用TextAsset类),之后读取并做相关操作。在这里我假设我们的物品有:
图片来自于siki教学视频截图

1. 创建.txt文本文档,用来存储所有物品信息

注意:
        (1)这里的文本文档的编码格式要为UTF-8,否则u3d读取不到内容。设置方法为——文件->另存为->编码
        ![最下面一行有编码选择](https://img-blog.csdn.net/20171105202240491?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTNkXzIwMTcxMDMw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

2. 我在文本文档里面写入了这三条信息:

图片为部分截图
每一行代表一件物品,这里我只写了药水的。每一行的第一列(以逗号来分列,注意这里的逗号是英文格式的逗号)
(1)在第一行中,第一列为物品的id,为什么是1001呢?在这里我将物品中的药品id全部设置为一零零几的。
(2)下一列为物品名称,将会显示在游戏中。
(3)第三列为图片名称,这里的图片名称必须是asset里面存在的图片的名称,用这个名称可以找到相应的图片,显示在游戏中。
(4)第四列为物品的类型,在第一幅图中我给不同的类型准备了相应的名称,顾名思义Drug是药品类
(5)回复hp的值,就是可以回复多少的hp
(6)回复mp的值
(7)出售价格
(8)购买价格

3. 在脚本中获取文本

在u3d中可以直接将txt文本文件拖入

    //获取物理txt文件
    public TextAsset objectsInfoListText;

4. 创建储存物品相关信息的类

由于物品具有不同的类型,不同类型的物品又有不同的属性,比如药品就有回复血量的属性,而装备没有,所以创建以下类,来暂存不同的物品,之所以说是暂存,是因为最终我们要将要品存在字典中,后面会讲到……

//定义一个枚举类型来存储物品的类型名称
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
{
}

5. 创建字典类

 用来储存相关的信息。为什么要用字典来储存呢,原因很简单,方便。字典可以通过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;
    }

6. OK!

 一切准备就绪,接下来就可以处理文本文档中的信息,然后存在相应的字典中
/// <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);
            }
        }
    }

7. 验证

 为了验证,可以在Awake();方法中输出一下字典里的东西
        print(objectInfoDict_Drug.Keys.Count);//输出储存药品的字典里有多少条信息,我这里是3条
        print(objectInfoDict_Equip.Keys.Count);
        print(objectInfoDict_Mat.Keys.Count);

8. 细节观看

 上面给出了所有思路,但有一些细节容易搞混大家,所以我直接给全所有的代码以供理解
 在我上传了一个C#资源文件里
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告