ScriptableObject主要作用
- 配置数据
- 数据复用(多个物体共享同一个数据,节省内存)
ScriptableObject数据文件的创建
- 在ScriptableObject的子类上加特性
- [CreateAssetMenu(fileName = “test1”, menuName = “ScriptableObject/CreateTest”)]
- 自定义编辑器工具
- MyData asset = ScriptableObject.CreateInstance<MyData>();
- AssetDatabase.CreateAsset(asset, “Assets/Resources/MyData.asset”);
ScriptableObject数据文件的生命周期函数
- Awake 数据文件创建时调用
- OnDestroy ScriptableObject 对象将被销毁时调用
- OnDisable ScriptableObject 对象销毁时、即将重新加载脚本程序集时 调用
- OnEnable ScriptableObject 创建或者加载对象时调用
ScriptableObject配合Json进行数据持久化
- private void Save()
{
string str = JsonUtility.ToJson(data);
File.WriteAllText(Application.persistentDataPath + “/MusicData.json”, str);
}private void Load()
{
if (!File.Exists(Application.persistentDataPath + “/MusicData.json”)) return;
string str = File.ReadAllText(Application.persistentDataPath + “/MusicData.json”);
JsonUtility.FromJsonOverwrite(str, data);
} - 反序列化不能直接用FromJson,因为会创建实例,而ScriptableObject对象规定只能通过ScriptableObject.CreateInstance来实例化,故只能使用FromJsonOverwrite进行数据覆写
数据多态
Buff继承ScriptableObject(一般为抽象类,子类重写),Buff又可分为ABuff,BBuff
在对应道具上的字段只要为Buff类即可实现父类装子类,便于配置
单例模式
自定义ScriptableObject子类只要继承这个单例类即可通过Instance获取实例
public class SingleScriptableObject<T> : ScriptableObject where T: ScriptableObject
{
private static T instance;
public static T Instance
{
get
{
//如果为空 首先应该去资源路劲下加载 对应的 数据资源文件
if (instance == null)
{
//我们定两个规则
//1.所有的 数据资源文件都放在 Resources文件夹下的ScriptableObject中
//2.需要复用的 唯一的数据资源文件名 我们定一个规则:和类名是一样的
instance = Resources.Load<T>("ScriptableObject/" + typeof(T).Name);
}
//如果没有这个文件 为了安全起见 我们可以在这直接创建一个数据
if(instance==null)
{
instance = CreateInstance<T>();
}
//甚至可以在这里 从json当中读取数据,但是我不建议用ScriptableObject来做数据持久化
return instance;
}
}
}

评论(0)
暂无评论