一、和策划配合,将数据表编辑后导入unity存储的方式

1、新建excel文件,配置基础道具信息

2、用在线Json工具,将excel转换为json配置,并稍微修改json配置(添加一个info作为key)

3、在unity脚本中读取道具信息

 

首先定义一个道具的数据结构,让我们能够从json字符中读出信息并存储

例如json的构成如下:

{
    "info": [{
        "id": 1,
        "name": "匕首",
        "icon": 1,
        "type": 100,
        "tips": "锋利"
    }, {
        "id": 2,
        "name": "头盔",
        "icon": 2,
        "type": 150,
        "tips": "坚固"
    }, {
        "id": 3,
        "name": "红药",
        "icon": 3,
        "type": 10,
        "tips": "加血"
    }, {
        "id": 4,
        "name": "蓝药",
        "icon": 4,
        "type": 10,
        "tips": "加蓝"
    }, {
        "id": 5,
        "name": "红宝石",
        "icon": 5,
        "type": 50,
        "tips": "值钱的"
    }, {
        "id": 6,
        "name": "蓝宝石",
        "icon": 6,
        "type": 20,
        "tips": "值钱的"
    }]
}

我们就用这样格式的类进行存储:

/// <summary>
/// 道具列表
/// </summary>
public class Items
{
    //还记得我们在Json最开始多写的那个info吗
    public List<Item> info;
}

/// <summary>
/// 道具具体属性
/// </summary>
[System.Serializable]
public class Item
{
    public int id;
    public string name;
    public string icon;
    public int type;
    public string tips;
}

通过以下方式读出json信息

//加载Resource文件夹下的Json文件
string info = ResMgr.GetInstance().Load<TextAsset>("Json/ItemInfo").text;
//根据Json文件的内容,解析成对应的数据结构 并存储起来
Items items = JsonUtility.FromJson<Items>(info);

//将道具列表信息存到字典中
for (int i = 0; i <items.info.Count; i++)
{
    itemInfos.Add(items.info[i].id, items.info[i]);
}

我们可以存储到一个字典中 方便我们后续使用 key值用id(唯一)value就用Item也就是道具

private Dictionary<int, Item> itemInfos = new Dictionary<int, Item>();

 

以上这种方式将含有道具种类与特性的excel文件提供给策划进行编辑,保证两端可分离

 

二、已经拥有存储的数据,对数据进行更新的方式

有时候我们需要用File文件保存我们的信息,能够随时让我们程序进行修改和读取,就像角色升级时角色属性的更改

首先定义一个角色类

public class Player
{
    public string name;
    public int lev;
    public int money;
    public int gem;
    public int pro;
    public List<ItemInfo> items;
    public List<ItemInfo> equips;
    public List<ItemInfo> gems;

    public Player()
    {
        name = "lzy";
        lev = 1;
        money = 9999;
        gem = 0;
        pro = 99;
        items = new List<ItemInfo>() { new ItemInfo() { id = 1, num = 1 } };
        equips = new List<ItemInfo>() { new ItemInfo() { id = 3, num = 10 } };
        gems = new List<ItemInfo>() { new ItemInfo() { id = 2, num = 5 } };
    }
}

/// <summary>
/// 玩家拥有的道具基础信息
/// </summary>
//加入序列化特性 让json能够读取 否则可能会报错
[System.Serializable]
public class ItemInfo
{
    public int id;
    public int num;
}

 我们需要指定文件的保存位置 通常我们将文件保存在Application.persistentDataPath,对应的路径就是C:\Users\86178\AppData\LocalLow\DefaultCompany\(项目名)/

这是一种可读可写的形式,书写方式如下

//存储角色信息
//也是提供给外部的获取角色信息的接口
    public Player playerInfo;

    //玩家信息存储路径
    private static string PlayerInfo_Url = Application.persistentDataPath + "/PlayerInfo.txt";

我们通常在初始化的时候需要新建一个角色,就需要读取File文件的信息,如果没有就需要新建一个

如果没有玩家数据就需要新建一个,我们从Player的构造函数中获得初始值,通过Json翻译成字符格式,再用File的书写格式将json字符串写进去,字符选择UTF8格式

如果有玩家数据就进行读取,File先读取到的是字节数组格式的信息,我们也通过json作为中间人进行转换,最终赋给玩家的数据结构中

//初始化角色信息
        if (File.Exists(PlayerInfo_Url))
        {
            //读取指定路径的文件的字节数组
            byte[] bytes= File.ReadAllBytes(PlayerInfo_Url);
            //把字节数组转成字符串
            string json = Encoding.UTF8.GetString(bytes);
            //再把字符串转成玩家的数据结构
            playerInfo = JsonUtility.FromJson<Player>(json);
        }
        else
        {
            //没有玩家数据时 初始化一个默认数据
            playerInfo = new Player();

            //并存储他
            string json=JsonUtility.ToJson(playerInfo);
            File.WriteAllBytes(PlayerInfo_Url, Encoding.UTF8.GetBytes(json));
        }