读表是做游戏很重要的一个环节,这里我用到的是Newtonsoft。
首先选择表格转换后的json,这里我用的是Exele2Json工具
这是转换后的json
[
{
"id": 10000,
"name": "勇者",
"description": "憧憬着冒险的少年,拥有无限的潜力",
"job": 0,
"ai": 1,
"hp": "500",//测试是否会自动转换为int
"act": 25,
"treatment": 5,
"def": 0.05,
"spd": 2.5,
"crit": 0,
"miss": 0.05,
"skill1": 30000,
"skill2": 0,
"skill3": 30127,
"hp_up": 0,
"act_up": 0,
"def_up": 0,
"spd_up": 0,
"crit_up": 0,
"hp_1": 2,
"atk": 2,
"def_1": 2,
"spd_1": 2
},
{
"id": 10001,
"name": "战士",
"description": "提升了近战的能力,一切近战职业的基础",
"job": 1,
"ai": 1,
"hp": 1000,
"act": 35,
"treatment": 5,
"def": 0.3,
"spd": 2.5,
"crit": 0.05,
"miss": 0.05,
"skill1": 30001,
"skill2": 0,
"skill3": 30128,
"hp_up": 0,
"act_up": 0,
"def_up": 0,
"spd_up": 0,
"crit_up": 0,
"hp_1": 3,
"atk": 2,
"def_1": 2,
"spd_1": 2
}
]
然后创建用于接收json的类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum CharacterJob
{
None = 0,
Warrior = 1, // 战士大类
Hunter = 2, // 猎人大类
Magician = 3, // 法师
Priest = 4, // 牧师
Robber = 5, // 盗贼
}
[System.Serializable]
public class CharacterData
{
public int id; // 编号
public string name; // 名称
public string description; // 描述
public CharacterJob job; // 职业
public int ai; // 调用ai
public int hp; // 血量
public float act; // 攻击
public float treatment; // 治疗系数
public float def; // 防御
public float spd; // 移动
public float crit; // 暴击
public float miss; // 闪避概率
public int skill1; // 普通攻击
public string skill2; // 技能攻击
public List<int> active_skills = new List<int>(); // 主动技能列表
public int skill3; // 被动技能
public int hp_up; // 血量成长
public float act_up; // 攻击成长
public float def_up; // 防御成长
public float spd_up; // 移动成长
public float crit_up; // 暴击成长
public int hp_1; // 数值1(表示1-5星)
public int atk; // 数值2
public int def_1; // 数值3
public int spd_1; // 数值4
}
这里我故意留了个坑,勇者的HP传入的是string。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
public class TestManager : MonoBehaviour
{
public TextAsset characterJson;//传进来的json
Dictionary<int, CharacterData> _characterDatas=new Dictionary<int, CharacterData>();//用于存储json的字典
public static string ARCHIVE_KEY_V1;//存档数据转换为的string
UserData userData;//接收存档数据
private void Start()
{
LoadCharacterData();
}
protected void LoadCharacterData()//读配置表
{
if (characterJson != null)
{
JArray array = JArray.Parse(characterJson.text);//读取json
List<CharacterData> datas = array.ToObject<List<CharacterData>>();//json转list
foreach (CharacterData character in datas)//list转字典
{
string[] arr = character.skill2.Split(",");//把json中带,的部分拆成数组
foreach (string skill in arr)
{
int id = int.Parse(skill);//把数组中的string转int
if (id > 0)
{
character.active_skills.Add(id);//存储这个id
}
}
_characterDatas.Add(character.id, character);//填充字典
}
}
else
{
Debug.LogError("Character data undefined!!!");
}
}
public void LoadArchiveData()//读档,把String转成Class然后读档
{
if (PlayerPrefs.HasKey(ARCHIVE_KEY_V1))
{
string str = PlayerPrefs.GetString(ARCHIVE_KEY_V1);
userData = JsonConvert.DeserializeObject<UserData>(str);
}
}
public void SaveGameData()//存档,把String转成Class然后读档
{
string jsonStr = JsonConvert.SerializeObject(userData);
PlayerPrefs.SetString(ARCHIVE_KEY_V1, jsonStr);
}
}
public class UserData//存档数据
{
public int Lv;
public int Money;
}
这是读表,存档和读档的3个方法。用Newtonsoft读表后string自动转乘了接收类型里的int。没有报错。
Newtonsoft拖入unity工程文件即可
Exele2Json是个小程序。windows里打开即可