Unity ScriptableObject的简单使用 和 坑点指南 必须要关闭编辑器才能写入磁盘 的问题

ScriptableObject是什么,在网上已经有了很多的教程,在这里就不在赘叙,现在将我超级崇拜的“妈妈说女孩子要自立自强”博主的博客链接贴在这里,虽然是2016年的博文,有些过时了,但是在2022年还是可以勉强的看一看:
https://blog.youkuaiyun.com/candycat1992/article/details/52181814


简单的介绍

它就是一个资源。
类似于一个Asset存储在本地的一个文件夹里面。
在这里插入图片描述
所以建议的是,在Asset的Resources文件夹下面新建这个文件。

简单的使用

只需要把平时的继承自MonoBehaviour改成ScriptableObject即可。

简单的示范

在这里插入图片描述

牛逼的错误

我们在脚本里面修改ScriptableObject里面的内容,但是我们打开“我的电脑”然后查看资源文件(.asset)文件,你会发现,我靠,虽然在unity里面确实是使用了最新的值,但是在磁盘上根本没有写入。

经过笨蛋小熊的查找一番资料,找到了原因,在新版的的Unity中,修改Asset并不会立即的写入到磁盘中去,正确的做法是,将我们要保存的那个ScriptableObject的引用,标记为dirty,然后在使用database的保存函数全部写入磁盘中去。

//仅供演示
public ScriptableObject sO;//我们自己的那个对asset的引用
EditorUtility.SetDirty(sO);//必须要写这个,要不然的化,光下面的那个是没有用的。
AssetDatabase.SaveAssets();

要饭时间

来个关注吧
/(ㄒoㄒ)/~~

### 使用 `ScriptableObject` 实现游戏存档功能 #### 创建自定义脚本对象用于存档 为了利用 `ScriptableObject` 进行存档操作,可以先创建一个新的 `ScriptableObject` 类型来代表玩家进度或其他需要持久化的数据结构。下面展示了一个简单的例子,其中包含了基本的游戏状态信息。 ```csharp using UnityEngine; /// <summary> /// 存储玩家的游戏进度其他重要信息。 /// </summary> [CreateAssetMenu(fileName = "PlayerData", menuName = "Game/Player Data")] public class PlayerData : ScriptableObject { public int health; public float positionX, positionY, positionZ; } ``` 此代码片段展示了如何通过 `[CreateAssetMenu]` 属性让开发者能够在 Unity 编辑器中轻松创建新的 `PlayerData` 资源文件[^4]。 #### 序列化与反序列化过程 当涉及到实际保存加载这些数据时,Unity 提供了内置的方法来进行 XML 或 JSON 格式的序列化处理。对于更复杂的场景,则可能需要用到第三方库如 Newtonsoft.Json 来简化这一过程。然而,在大多数情况下,默认机制已经足够满足需求。 在保存之前,应该确保所有的字段都被标记为可序列化(即它们不是私有的),这样才能保证所有必要的属性都能被正确写入磁盘并稍后恢复。 #### 保存方法实现 接下来是具体的保存逻辑: ```csharp void SaveGameData(PlayerData playerData) { string json = JsonUtility.ToJson(playerData); // 将JSON字符串保存到指定路径下的文本文件中 System.IO.File.WriteAllText(Application.persistentDataPath + "/savegame.json", json); Debug.Log("Saved game data."); } ``` 这段 C# 代码说明了怎样把当前活动的 `playerData` 对象转换成 JSON 字符串形式,并将其存储在一个外部文件里以便后续检索[^3]。 #### 加载方法实现 相应的加载函数如下所示: ```csharp PlayerData LoadGameData() { string path = Application.persistentDataPath + "/savegame.json"; if (System.IO.File.Exists(path)) { string json = System.IO.File.ReadAllText(path); // 解析JSON字符串回到原始的对象形态 return JsonUtility.FromJson<PlayerData>(json); } Debug.LogWarning("No save file found!"); return null; } ``` 这里实现了从先前保存的位置读取 JSON 文件内容的功能,并通过 `JsonUtility.FromJson<T>()` 方法重建原来的 `PlayerData` 实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值