ScriptableObject 序列化游戏数据/保存数据到本地_015
发表于2018-09-02
游戏中经常会有一些需要序列化的数据,通常的做法就是把这些数据 [SerializeField],然后在视图面板中修改数值,这样不需要修改脚本,就可以进行数据调整,方便策划大大修改数值。
不过这样做还有一个缺点,因为序列化的数据都保存在Scene场景内,没修改一次数值,场景文件(Scene.unity)都会随之变动,多人合作时,场景文件就很容易发生冲突。在这里就给大家简单介绍一下利用ScriptableObject 来进行序列化,它可以在资源面板创建一个Asset文件,把数据存储在资源文件中,通过属性面板可修改数值。
1. 创建 ScriptableObject 类
using UnityEngine; //在资源面板右键Create,创建该类对应的Asset文件 [CreateAssetMenu(fileName = "GameDataAsset", menuName = "Creat GameData Asset")] public class GameData : ScriptableObject { [Header("测试_字符串")] public string testStr = "Test String"; [Space(10)] [Header("测试_数组")] public int[] testArr; }
在类中定义需要序列化的属性,这样就可以啦,是不是很简单~
2. 在资源面板中创建Asset文件
右键 => Create => 创建ScriptableObject类对应的Asset文件
3. 填写/修改数值
4. 读取Asset文件,获取序列化的信息
在这里使用Resources加载的Asset文件,也可以通过AB加载等方式,或者直接序列化GameData 类都可。
加载到ScriptableObject类之后,就可以使用里面的属性啦
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GetGameData : MonoBehaviour { GameData gameData; void Start () { gameData = Resources.Load<GameData>("GameDataAsset"); Debug.Log(gameData.testStr); foreach (var item in gameData.testArr) { Debug.Log(item); } } }
将游戏数据保存到本地,也有很多种方法
数据量比较少的话,可以直接用Unity提供的PlayerPrefs,不过只能保存int, float, string。数据量多可以用Json等方式,这里跟大家简单介绍一下利用ScriptableObject保存游戏数据:
与ScriptableObject序列化数据类似:
1. 创建 ScriptableObject 类
2. 创建 Asset 文件
3. 读取 Asset 文件,修改其属性值,数据变化将自动保存到 Asset 文件
public class GetGameData : MonoBehaviour { GameData gameData; void Start () { gameData = Resources.Load<GameData>("GameDataAsset"); Debug.Log(gameData.testStr); gameData.testStr = "Change Value"; Debug.Log(gameData.testStr); } }
代码运行前
代码运行后,Asset文件数值修改完成