推荐阅读
- CSDN主页
- GitHub开源地址
- Unity3D插件分享
- 简书地址
- 我的个人博客
- QQ群:1040082875
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
我发现还有很多小伙伴对于数据的保存很疑惑,不知道怎么保存数据,也不知道跨场景的数据怎么保存。
Unity的数据的持久化主要有以下几种方式:
这里就不展开讲了,有机会再列一篇文章详细的讲一下。
这里只说一下这几种数据保存的优缺点。
优点:
它是持久存储于设备上的,只要用户没有删除应用或者手动去清除数据,PlayerPrefs的数据会一直保留,适合存储一些设置相关的信息。
PlayerPrefs采用键值对的方式进行数据的查询与存储。
缺点:
数据格式比较单一,只支持Int、Float、String这几种类型的数据。
优点:
数据保存在内存中,只要不关闭程序数据就一直存在,还可以跨场景调用数据类。
可以使用构造函数将数据类中的数组进行初始化,特别方便,不用担心忘了初始化了。
缺点:
程序不小心崩溃的时候,数据也会丢失,数据不会长久保存。
需要去自定义数据结构。
优点:
数据一直存在,可以跨场景调用数据,数据持久化存在。
可以及时保存数据,避免程序奔溃后的数据丢失。
缺点:
需要进行IO操作,影响效率,代码难度也会提高。
需要学习特定格式文件的解析和读取代码。
数据保存到本地也可能被人为修改数据,造成错误。
优点:
数据一直存在,可以跨场景调用数据,数据持久化存在。
不用担心数据被人为修改,也不用担心数据的保存问题。
数据发给服务器,其他就不用管,需要数据的时候去服务器获取。
缺点:
需要建立服务器,如果数据量大的话,对服务器的压力也比较大。
本篇文章就针对使用数据类保存数据这种方式进行演示。
首先,我们新建一个GlobalData.cs脚本,名字不重要,只要自己觉得合适就行:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GlobalData : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
对于数据类来说,不需要继承MonoBehaviour接口,因为不需要进行任何Start、Update函数操作:
public class GlobalData
{
}
添加一个私有构造函数,在类初始化的时候调用,可以用来初始化一些数组:
public class GlobalData
{
// 私有构造函数,在类初始化的时候进行调用
private GlobalData()
{
}
}
使用单例模式,设置一个全局单例对象:
public class GlobalData
{
// 私有构造函数,在类初始化的时候进行调用
private GlobalData()
{
}
// 使用单例模式,设置一个全局单例对象
private static GlobalData _instance;
public static GlobalData Instance
{
get
{
if (_instance == null)
{
_instance = new GlobalData();
}
return _instance;
}
}
}
这样的话基本的结构已经完成了,就下来就是需要什么数据就设置什么数据即可。
添加了姓名、年龄、性别、分数字段,如下:
using System.Collections.Generic;
public class GlobalData
{
// 私有构造函数,在类初始化的时候进行调用
private GlobalData()
{
Score = new Dictionary<string, int>();
}
// 使用单例模式,设置一个全局单例对象
private static GlobalData _instance;
public static GlobalData Instance
{
get
{
if (_instance == null)
{
_instance = new GlobalData();
}
return _instance;
}
}
public string Name { get; set; }//姓名
public int Age { get; set; }//年龄
public bool Sex { get; set; }//性别
public Dictionary<string, int> Score { get; set; }//分数 名字跟分数对应
}
注意:在构造函数中,将Dictionary类型的Score变量进行了初始化。
下面就演示一下如何设置数据类的变量,如何获取数据类的变量:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestCall : MonoBehaviour
{
void Start()
{
GlobalData.Instance.Name = "张三";
GlobalData.Instance.Age = 18;
GlobalData.Instance.Sex = true;
GlobalData.Instance.Score.Add("张三", 88);
Debug.Log(GlobalData.Instance.Name);
Debug.Log(GlobalData.Instance.Age);
Debug.Log(GlobalData.Instance.Sex);
Debug.Log(GlobalData.Instance.Score["张三"]);
}
}
你的点赞就是对博主的支持,有问题记得留言:
博主主页有联系方式。
博主还有跟多宝藏文章等待你的发掘哦:
专栏 | 方向 | 简介 |
---|---|---|
Unity3D开发小游戏 | 小游戏开发教程 | 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。 |
Unity3D从入门到进阶 | 入门 | 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。 |
Unity3D之UGUI | UGUI | Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。 |
Unity3D之读取数据 | 文件读取 | 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。 |
Unity3D之数据集合 | 数据集合 | 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。 |
Unity3D之VR/AR(虚拟仿真)开发 | 虚拟仿真 | 总结博主工作常见的虚拟仿真需求进行案例讲解。 |
Unity3D之插件 | 插件 | 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等 |
Unity3D之日常开发 | 日常记录 | 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等 |
Unity3D之日常BUG | 日常记录 | 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。 |