【Unity3D日常开发】Unity3D中使用数据类保存数据,持久保存数据、数据存放在、跨场景调用数据类

举报
恬静的小魔龙 发表于 2022/05/13 22:53:10 2022/05/13
【摘要】 推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得...

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新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()
    {
        
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

对于数据类来说,不需要继承MonoBehaviour接口,因为不需要进行任何Start、Update函数操作:

public class GlobalData
{
}

  
 
  • 1
  • 2
  • 3

添加一个私有构造函数,在类初始化的时候调用,可以用来初始化一些数组:

public class GlobalData
{
    // 私有构造函数,在类初始化的时候进行调用
    private GlobalData()
    {
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用单例模式,设置一个全局单例对象:

public class GlobalData
{
    // 私有构造函数,在类初始化的时候进行调用
    private GlobalData()
    {
    }
    // 使用单例模式,设置一个全局单例对象
    private static GlobalData _instance;
    public static GlobalData Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new GlobalData();
            }
            return _instance;
        }
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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

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; }//分数 名字跟分数对应
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

注意:在构造函数中,将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["张三"]);
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

运行结果如下:
在这里插入图片描述

三、后记

你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

在这里插入图片描述

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

专栏 方向 简介
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和坑,让后来人可以有些参考。

文章来源: itmonon.blog.csdn.net,作者:恬静的小魔龙,版权归原作者所有,如需转载,请联系作者。

原文链接:itmonon.blog.csdn.net/article/details/124744558

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。