1.在很多时候,我们有游戏物体需要加载时,我们一般考虑从配置文件下加载进来。所以我们今天介绍一下如何使用Json文件来存储数据并且加载进代码中。
首先要了解:
JsonUtility.fromjson:把Json信息转化为一个对象
JsonUtility.tojson:把一个对象转化为json信息
序列化:为了传输方便,将要传输的对象序列化为二进制的数据流,效率极高,接收时通过反序列化转化为对象,简而言之,序列化即对象转二进制,反序列化即二进制转对象
①首先准备一下Json文件
// Json文件
{
"infoList":
[
{"panelTypeString":"Skill",
"path":"Assets/UI/icon.prefab"
},
{
"panelTypeString":"Task",
"path":"Assets/UI/icon.prefab"
}
]
}
检查是否正确可以上Json检验网检验。
②在这里我需要一个脚本来存放我要加载物体的类型(如果不需要加载类型,这个可以省略)
//这里需要加载UI面板的类型
public enum UIPanelType
{
MainMenu,
Task,
Shop,
Bag,
Skill,
System,
ItemMessage
}
③接下来需要创建一个脚本UIPanelInfo进行序列化和反序列化,该脚本需要实现ISerializationCallbackReceiver这个序列化接口
// 进行反序列化和序列化
[Serializable]//一定要写,而且不能错
public class UIPanelInfo:ISerializationCallbackReceiver
{
[NonSerialized]//一定要写,而且不能错
//UI的类型
public UIPanelType uiPanelType;
//这里要和你的Json里命名一样,顺序也要一样,例如:"panelTypeString":"Skill"的panelTypeString
public string panelTypeString;
//UI的路径
public string path;
//反序列之前调用
public void OnAfterDeserialize()
{
uiPanelType = (UIPanelType)Enum.Parse(typeof(UIPanelType), panelTypeString);//将反序列化的字符串类型转化为对应的枚举
}
//序列化之前调用该方法
public void OnBeforeSerialize()
{
}
}
④创建另外一个类UIPanelTypeJson来保存数据
[Serializable]
class UIPanelTypeJson
{
public List<UIPanelInfo> infoList;//C#中集合和json的集合名字要一致,且需要标记上上序列化
}
⑤下面的类为将Json文件的数据加载进来
public class UIManager
{
//单例模式
private static UIManager instance;
public static UIManager GetInstacne
{
get
{
if(instance==null)
{
instance = new UIManager();
}
return instance;
}
}
//存储加载进来数据的字典
private Dictionary<UIPanelType, string> pannelPathDict;
//构造私有化
private UIManager()
{
ParseUIPanelTypeJson();//加载Json文件等操作
}
void ParseUIPanelTypeJson()
{
if(pannelPathDict==null)
{
pannelPathDict = new Dictionary<UIPanelType, string>();
}
//加载json文件,json文件在Resources文件中
TextAsset info = Resources.Load<TextAsset>("Json/UIPanelTypeJson");
UIPanelTypeJson jsonObj = JsonUtility.FromJson<UIPanelTypeJson>(info.text);
//将每个数据存储在字典中
foreach (UIPanelInfo item in jsonObj.infoList)
{
pannelPathDict.Add(item.uiPanelType, item.path);
}
}
//测试是否成功把数据加载到unity中
public void Test()
{
string path;
pannelPathDict.TryGetValue(UIPanelType.Skill,out path);
Debug.Log(path);
}
}
⑥我们要再创建一个脚本来启动加载json,因为之前的脚本都没有继承mono,所以无法通过unity查看
public class GameRoot : MonoBehaviour
{
void Start()
{
UIManager.GetInstacne.Test();
}
}
在uinty里创建一个空物体,将脚本挂载上去,运行
,控制台输出结果
如果有报空错误,可能是加载json的路径错了,或者是Resources文件夹名名不对,或者是json的内容格式错误,或者是没有序列化和反序列化。