赞
踩
so(ScriptableObject 这里是简称,后面都用so代替ScriptableObject)在处理大量数据,属实不怎么样,本人深有体会,在项目中一开始定的是用so存储数据,到后期数据量变大了,so的维护就变的特别麻烦,因为so用代码赋值后会暂时保存,在unity的属性面板上可以看到我们修改后的内容,但是当我们重启unity后会发现so中的数据又恢复到原来的数据了,也就是说没有保存在本地,面对这种办法,我们可以用json读取后存到so中,话不多说,开始贴代码
- [CreateAssetMenu(fileName = "Options", menuName = "创建题目so")]
- public class data : ScriptableObject
- {
- [NonReorderable]
- public List<QuestionBank> questionBanks;
-
- List<dates> dates;
- [ContextMenu("运行")]
- private async Task aw()
- {
- Debug.Log("测试有没有值:" + questionBanks[0].TitleStr);
- string path = Application.streamingAssetsPath + "/题库.json";
- Debug.Log(path);
- var uri = new System.Uri(Path.Combine(path));
- string url = uri.ToString();
- UnityWebRequest www = UnityWebRequest.Get(uri);
- await www.SendWebRequest();
- try
- {
- if (www.isNetworkError || www.isHttpError)
- {
- Debug.LogError(www.error);
- }
- else
- {
- Debug.Log(www.downloadHandler.text);
- string jsonStr = www.downloadHandler.text;
- Debug.Log(jsonStr);
- List<dates> da = JsonConvert.DeserializeObject<List<dates>>(jsonStr);
- Debug.Log(da[0].id);
- dates = da;
- }
- }
- catch (System.Exception ex)
- {
- Debug.LogError($"有报错!{ex.Message}");
- throw;
- }
- for (int i = 0; i < dates.Count; i++)
- {
- questionBanks[i].TitleStr = dates[i].topic;
- questionBanks[i].id = int.Parse(dates[i].id);
- questionBanks[i].OptionStr1 = dates[i].optionA;
- questionBanks[i].OptionStr2 = dates[i].optionB;
- questionBanks[i].OptionStr3 = dates[i].optionC;
- questionBanks[i].OptionStr4 = dates[i].optionD;
- questionBanks[i].CorrectOptions = dates[i].correctoption;
- }
- }
- }
我们是在创建so的类里写方法,读取json存入so,存入后要按ctrl+s保存才有效,写完这个后回到unity的属性面板,找到创建好的so,在空白处单击右键
然后点击运行,就可以执行读取json并赋值给so的操作了,用这种方法保存的在重启后数据也还在,也就是说是写入asset了(小声bb,json赋值so的操作本人跟主程交流了一番,主程给的这个方法,特好用,主程万岁!!!)
如果不知道so怎么创建的,可以去看我之前写的文章
so的创建https://blog.csdn.net/k253316/article/details/128233834?spm=1001.2014.3001.5502
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。