大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

我发现还有很多小伙伴对于数据的保存很疑惑,不知道怎么保存数据,也不知道跨场景的数据怎么保存。

Unity的数据的持久化主要有以下几种方式:

  • 使用PlayerPrefs类,进行数据持久化
  • 使用数据类保存数据
  • 使用本地文件保存数据,比如Json、XML、TXT
  • 使用服务器获取数据

这里就不展开讲了,有机会再列一篇文章详细的讲一下。

这里只说一下这几种数据保存的优缺点。

1-1、使用PlayerPrefs类,进行数据持久化

优点:

它是持久存储于设备上的,只要用户没有删除应用或者手动去清除数据,PlayerPrefs的数据会一直保留,适合存储一些设置相关的信息。

PlayerPrefs采用键值对的方式进行数据的查询与存储。

缺点:

数据格式比较单一,只支持Int、Float、String这几种类型的数据。

1-2、使用数据类保存数据

优点:

数据保存在内存中,只要不关闭程序数据就一直存在,还可以跨场景调用数据类。

可以使用构造函数将数据类中的数组进行初始化,特别方便,不用担心忘了初始化了。

缺点:

程序不小心崩溃的时候,数据也会丢失,数据不会长久保存。

需要去自定义数据结构。

1-3、使用本地文件保存数据,比如Json、XML、TXT

优点:

数据一直存在,可以跨场景调用数据,数据持久化存在。

可以及时保存数据,避免程序奔溃后的数据丢失。

缺点:

需要进行IO操作,影响效率,代码难度也会提高。

需要学习特定格式文件的解析和读取代码。

数据保存到本地也可能被人为修改数据,造成错误。

1-4、使用服务器获取数据

优点:

数据一直存在,可以跨场景调用数据,数据持久化存在。

不用担心数据被人为修改,也不用担心数据的保存问题。

数据发给服务器,其他就不用管,需要数据的时候去服务器获取。

缺点:

需要建立服务器,如果数据量大的话,对服务器的压力也比较大。

二、使用数据类保存数据

本篇文章就针对使用数据类保存数据这种方式进行演示。

2-1、建立数据类

首先,我们新建一个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;
}
}
}

这样的话基本的结构已经完成了,就下来就是需要什么数据就设置什么数据即可。

2-2、添加数据字段

添加了姓名、年龄、性别、分数字段,如下:

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变量进行了初始化。

2-3、调用数据类

下面就演示一下如何设置数据类的变量,如何获取数据类的变量:

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日常开发】Unity3D中使用数据类保存数据,持久保存数据、数据存放在、跨场景调用数据类_游戏引擎_02

博主还有跟多宝藏文章等待你的发掘哦:

专栏

方向

简介

​​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和坑,让后来人可以有些参考。