2024年8月14日早,因数据持续化存储,重启电脑后数据会丢失,而我找不到原因被领导质疑了,故写一片博客记录这个错误。
省流
使用在编辑器的play模式中为ScriptableObject赋值之后,需要使用
#if UNITY_EDITOR
UnityEditor.EditorUtility.SetDirty(_ScriptableObject);
//_ScriptableObject是需要保存的ScriptableObject 对象
#endif
保存,否则会在重启电脑之后清空数据。但是自己赋值,复制的数据不会消失。
Unity数据保存使用ScriptableObject
例子:
创建一个ScriptableObject
,如果继承自ScriptableObject的对象中包括另外一个对象,那么那个对象应被标记为:[System.Serializable]。
否则是看不到的。对象都应该被标记为[System.Serializable],除了继承自ScriptableObject的对象。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "ScriptTestSetData", menuName = "ScriptableObjects/ScriptTestSetData")]
public class ScriptTestSetData : ScriptableObject
{
public List<SriptDateItem> sriptDateItems = new List<SriptDateItem>();
}
[System.Serializable]
public class SriptDateItem
{
public string Name = "";
public string Description = "";
public List<Student> students = new List<Student>();
}
[System.Serializable]
public class Student
{
public string Tall;
public string Sex;
}
写入数据
using System.Collections.Generic;
using UnityEngine;
public class TestScriptableObj : MonoBehaviour
{
public ScriptTestSetData scriptTestSetData;
private void Start()
{
List<SriptDateItem> aaa = new List<SriptDateItem>(); ;
for (int j = 0; j < 5; j++)
{
SriptDateItem sriptDateItem = new SriptDateItem();
sriptDateItem.Name = "名称" + j.ToString();
sriptDateItem.Description = "";
sriptDateItem.students = new List<Student>();
for (int i = 0; i < 3; i++)
{
Student student = new Student();
student.Tall = "11" + i.ToString();
student.Sex = "iiii" + i;
sriptDateItem.students.Add(student);
}
aaa.Add(sriptDateItem);
}
scriptTestSetData.sriptDateItems = aaa;
}
}
右键创建一个对象
创建一个空物体并挂载脚本,将上面的创建的对象拖拽并赋值,然后运行,ScriptableObject就会被赋值。
但是重启电脑之后就没有啦: