IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity:Json实现数据持久化 -> 正文阅读

[游戏开发]Unity:Json实现数据持久化

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;

//序列化,方便后面存储到json文件中
[System.Serializable]
public class PlayerAttribute
{
    public float speed;
    public float jumpforce;
    public int maxJumpNum;
    public float maxHealth;
    public float currentHealth;
}

public class PlayerAttriSave : MonoBehaviour
{
    public PlayerController player;
    PlayerAttribute pa = new PlayerAttribute();

    private void Start()
    {
        string filepath = Application.streamingAssetsPath + "/PlayerAttribute.json";
        if (File.Exists(filepath))
        {
            LoadData();
        }
        else
        {
            Initialize();
        }
    }
    private void GenerateData()
    {
        pa.speed = player.speed;
        pa.jumpforce = player.jumpforce;
        pa.maxJumpNum = player.maxJumpNum;
        pa.currentHealth = player.currentHealth;
        pa.maxHealth = player.maxHealth;
    }
    public void SaveData()
    {
        string json = JsonUtility.ToJson(pa, true);
        string filepath = Application.streamingAssetsPath + "/PlayerAttribute.json";

        using (StreamWriter sw = new StreamWriter(filepath))
        {
            sw.WriteLine(json);
            sw.Close();
            sw.Dispose();
        }
    }

    public void OnClickQuit()
    {
        GenerateData();
        SaveData();
        UnityEditor.EditorApplication.isPlaying = false;
        Application.Quit();
    }
    void LoadData()
    {
        string json;
        string filepath = Application.streamingAssetsPath + "/PlayerAttribute.json";
        using (StreamReader sr = new StreamReader(filepath))
        {
            json = sr.ReadToEnd();
            sr.Close();
        }
        pa = JsonUtility.FromJson<PlayerAttribute>(json);
        Change();
    }

    void Change()
    {
        player.speed = pa.speed;
        player.jumpforce = pa.jumpforce;
        player.maxJumpNum = pa.maxJumpNum;
        player.currentHealth = pa.currentHealth;
        player.maxHealth = pa.maxHealth;
        player.SetHealth();
        player.SetMaxHealth();

    }

    void Initialize()
    {
        player.speed = 5f;
        player.jumpforce = 10f;
        player.maxJumpNum = 2;
        player.maxHealth = 10f;
        player.currentHealth = 5f;

    }
    //如何调试
}

流程图:

在这里插入图片描述

知识点:

1.

string filepath = Application.streamingAssetsPath + "/PlayerAttribute.json";

Application.streamingAssetsPath为StreamingAssets 文件夹的路径(只读)。

使用 StreamingAssets 文件夹来存储资源。在运行时,Application.streamingAssetsPath 提供文件夹路径。将资源名称添加到 Application.streamingAssetsPath。构建的应用程序即可加载此地址的资源。
在这里插入图片描述

2.

using (StreamWriter sw = new StreamWriter(filepath))
        {
            sw.WriteLine(json);
            sw.Close();
            sw.Dispose();
        }

using(){}其实就相当于{},不同的是using(){}可以用于定义一个范围,在此范围的末尾自动将对象释放。小括号内声明要使用的对象,那个对象必须实现IDisposable接口或者其基类实现了IDisposable接口。

使用方法:using(){}常常用于避免如一些文件流,文件句柄,数据库接口在使用完了后顽疾了释放而处于一直被占用的状态。
使用场景:当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了此代码段就自动调用这个类实例的Dispose。

结尾不用显式调用,官方文档也没调用(StreamReader 类

3.

sw.WriteLine(json);

写入Json

json = sr.ReadToEnd();

读取来自流的当前位置到结尾的所有字符。返回String

StreamReader sr = new StreamReader(filepath)

filepath:要读取的完整文件路径。

4.

 pa = JsonUtility.FromJson<PlayerAttribute>(json);

Json转对象
< PlayerAttribute >对象的类型
(json)Json文件的字符串形式

string json = JsonUtility.ToJson(pa, true);

对象转为Json的字符串形式,true表示实现可读性

5.

File.Exists(filepath)

检测文件是否存在
filepath为文件完整路径

6.

UnityEditor.EditorApplication.isPlaying = false;
Application.Quit();

第一个函数:编辑器当前是否处于播放模式?,用于未发布阶段
第二个函数:退出播放器应用程序,用于发布阶段

参考资料:

unity Application 本地目录资源路径详解 Application.StreamingAssetsPath、Application.PersistentDataPath等

Application.streamingAssetsPath

c#using关键字的作用

C# 使用 using 定义一个范围的用法

using(){}的使用

Using的用法

using(){},Close(),Dispose()的区别

对C#中的Close()和Dispose()的浅析

StreamReader.ReadToEnd 方法

JsonUtility.ToJson

JsonUtility.FromJson

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:08:57  更:2022-04-26 12:11:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:39:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码