0
点赞
收藏
分享

微信扫一扫

TensorFlow 的应用场景有哪些

墨香子儿 2023-11-05 阅读 18

ˊˊ

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity基础实战

🅰️



文章目录


前言


🎶(1持久数据文件夹


在这里插入图片描述

  • 先获取文件夹的位置
  • 1.存储字符串到指定路径文件中
  • 2.在指定路径文件中读取字符串

🎶(2JsonUtlity进行序列化


  • 现实作用:
    1.将对象序列化成Json格式
    2.将Json格式反序列化为对象

在这里插入图片描述

  • 引用 using System.IO

🪶0. jsonUtilty的注意点(缺点)


😶‍🌫️注意:

    1.float序列化时看起来会有一些误差
    2.被包裹的自定义类需要加上序列化特性[System.Serializable]
    3.想要序列化私有变量 需要加上特性[SerializeField]
    4.JsonUtility不支持字典
    5.JsonUtlity存储null对象不会是null 而是默认值的数据,
    比如空int 会变成0
    6.JsonUtility无法直接反序列化读取数据集合"[]",需要用一个对象包裹它
    7.文本编码格式需要时UTF-8 不然无法加载

在这里插入图片描述

在这里插入图片描述


🪶1.将对象序列化成字符串(Json格式)


  • string jsonStr = JsonUtility.ToJson( dataGame );

           // DataGame 是类对象
    
  • File.WriteAllText(Application.persistentDataPath + “/text1.json”, jsonStr);

         //将序列化后的字符串数据存在文件夹中
    

🪶2.将Json反序列化成对象


  • jsonStr = File.ReadAllText(Application.persistentDataPath + “/text1.json”);

       //读取文件中的字符串 
    
  • DataGame dataGame = JsonUtility.FromJson< DataGame >(jsonStr);

      //使用Json字符串内容 转换成类对象
    
  • 代码

 jsonStr  = File.ReadAllText(Application.persistentDataPath + "/text1.json");
 
  DataGame dataGame = JsonUtility.FromJson<DataGame >(jsonStr);
 

🪶3.练习(将序列化和反序列化变成方法调用)


using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

[System.Serializable]
public class Item
{
    public int id;
    public int num;

    public Item( int ID,int NUM)
    {
        id = ID;
        num = NUM;
    }
}

public class BossInfo
{
    public string name;
    public int attack;
    public int defence;
    public float moveSpeed;
    public double roundSpeed;
    public Item weapon;
    public List<int> listInt;
    public List<Item> itemList;
    public Dictionary<int, Item> itemDic1;
    public Dictionary<string, Item> itemDic2;
    [SerializeField ]
    private int self = 2 ;
    [SerializeField]
    protected int pro = 3;   

    //序列化
    public void serilized(BossInfo obj)
    {
        if(obj!=null )
        {
            string onjInfo = JsonUtility.ToJson(obj);
            File.WriteAllText(Application.persistentDataPath + ("/BossInfo.json"), onjInfo);
        }
       
    }

    //反序列化
    public BossInfo  RevSerilized(string path)
    {
        if (path != null)
        {
            string objInfo = File.ReadAllText(Application.persistentDataPath +"/"+ path);
            return JsonUtility.FromJson<BossInfo>(objInfo);
        }
        else return null;
    } 
}

public class text : MonoBehaviour
{
    private void Start()
    {
        BossInfo boss = new BossInfo();
        boss.name = "鸭嘴兽";
        boss.attack = 100;
        boss.defence = 20;
        boss.moveSpeed = 50;
        boss.roundSpeed = 30;
        boss.weapon = new Item(001, 10);
        boss.listInt = new List<int>() { 1, 2, 3, 4 };
        boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };
        boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };
        boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };
        boss.serilized(boss); //JsonUyility 不支持字典
        print(Application.persistentDataPath);
         boss.RevSerilized("BossInfo.json");
    }
}


🎶(3LitJson进行序列化


它是一个第三方库是第三方编写的(而UtilityJson是自己编写的),用于处理Json的序列化和反序列化,LitJson是C#编写的,体积小、速度快、易于使用

🪶1.如何使用


  • 在官网中跳转GitHub获取最新版本
    在这里插入图片描述
  • 将下好的版本中的C#脚本拖到Unity中
    在这里插入图片描述

🪶2. LitJson的注意点


  • 1.序列化不需要加特性
  • 2.不能序列化私有变量
  • 3.需要引用命名空间
  • 4.可以保存null值
  • 5.可以序列化字典,但是键必须是字符串类型否则会报错
  • 6.序列化类的时候一定要确保它有无参构造函数否则会报错
  • 7.可以直接读取数据集合[]
  • 8.文本编码格式需要时UTF-8 不然无法加载

🪶3.序列化


  • 和方式JsonUtility一样

  • string jsonStr = JsonMapper.ToJson(obj);

            // obj是类对象
    
  • File.WriteAllText(Application.persistentDataPath + “/text.json”, jsonStr);

            //将序列化后的字符串数据存在文件夹中
    

🪶4.反序列化


  • jsonStr = File.ReadAllText(Application.persistentDataPath + “/text.json”);

  • objInfo 2 = JsonMapper.ToObject< objInfo> (jsonStr);

       //通过泛型转换更方便
    
  • ②JsonData data = JsonMapper.ToObject(jsonStr);

       //JsonData是LitJson提供的类对象
        访问其中的内容要用键值对的形式去
             print(data["age"]);
    

🪶5.练习


using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Item
{
    public int id;
    public int num;

    public Item() { } //因为有参把他替换了所以需要重新声明
    public Item( int ID,int NUM)
    {
        id = ID;
        num = NUM;
    }
}

public class BossInfo
{
    public string name;
    public int attack;
    public int defence;
    public float moveSpeed;
    public double roundSpeed;
    public Item weapon;
    public List<int> listInt;
    public List<Item> itemList;
    public Dictionary<int, Item> itemDic1;
    public Dictionary<string, Item> itemDic2;
    private int self = 2 ;
    protected int pro = 3;   


    //LitJson序列化
    public void LSerilized(BossInfo obj)
    {
        if (obj != null)
        {
            string objInfo = JsonMapper.ToJson(obj);
            File.WriteAllText(Application.persistentDataPath + ("/BossInfo2"), objInfo);
        }
    }

    //LitJson反序列化
    public BossInfo RevLSerilized(string path)
    {
       if(path != null )
        {
            string objInfo =  File.ReadAllText(Application.persistentDataPath +"/"+path );
            return   JsonMapper.ToObject<BossInfo>(objInfo);

        }
       else   return null;
    }
}

public class text : MonoBehaviour
{
    private void Start()
    {
        BossInfo boss = new BossInfo();
        boss.name = "鸭嘴兽";
        boss.attack = 100;
        boss.defence = 20;
        boss.moveSpeed = 50;
        boss.roundSpeed = 30;
        boss.weapon = new Item(001, 10);
        boss.listInt = new List<int>() { 1, 2, 3, 4 };
        boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };
        boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };
        boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };
        boss.LSerilized(boss); //JsonUyility 不支持字典
        print(Application.persistentDataPath);
        boss.RevLSerilized("BossInfo.json");
    }
}


🎶(4JsonUtility和LitJson的区别ˊ


  • 1.JsonUt1ity是Unity自带,LitJson是第三方需要引用命名空间
  • 2.JsonUt1ity使用时自定义类需要加特性,LitJson不需要
  • 3.JsonUt1ity支持私有变量(加特性),LitJson不支持
  • 4.JsonUt1ity不支持字典,LitJson支持(但是键只能是字符串)
  • 5.JsonUt1ity不能直接将数据反序列化为数据集合(数组字典),LitJson可以
  • 6.JsonUt1ity对自定义类不要求有无参构造,LitJson需要
  • 7.JsonUt1ity存储空对象时会存储默认值而不是nu11,LitJson会存null

🎶(5Json管理器


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

/// <summary>
/// 序列化和反序列化Json时  使用的是哪种方案
/// </summary>
public enum JsonType
{
    JsonUtlity,
    LitJson,
}

/// <summary>
/// Json数据管理类 主要用于进行 Json的序列化存储到硬盘 和 反序列化从硬盘中读取到内存中
/// </summary>
public class JsonMgr
{
    private static JsonMgr instance = new JsonMgr();
    public static JsonMgr Instance => instance;

    private JsonMgr() { }

    public void SaveData(object data, string fileName, JsonType type = JsonType.LitJson)
    {
      
        string path = Application.persistentDataPath + "/" + fileName + ".json";
        string jsonStr = "";

        switch (type)
        {
            case JsonType.JsonUtlity:
                jsonStr = JsonUtility.ToJson(data);
                break;
            case JsonType.LitJson:
                jsonStr = JsonMapper.ToJson(data);
                break;
        }
        
        File.WriteAllText(path, jsonStr);
    }

    /// <summary>
    /// Json反序列化
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="fileName"></param>
    /// <param name="type"></param>
    /// <returns></returns>
    public T LoadData<T>(string fileName, JsonType type = JsonType.LitJson) where T : new()
    {
        //先判断 是否存在streamingAssets中
        string path = Application.streamingAssetsPath + "/" + fileName + ".json";

        //如果不存在默认文件 就从 persistentDataPath文件夹中去寻找
        if (!File.Exists(path))
            path = Application.persistentDataPath + "/" + fileName + ".json";
        //如果读写文件夹中都还没有 那就返回一个默认对象
        if (!File.Exists(path))
            return new T();

        //进行反序列化
        string jsonStr = File.ReadAllText(path);
        //数据对象
        T data = default(T);
        switch (type)
        {
            case JsonType.JsonUtlity:
                data = JsonUtility.FromJson<T>(jsonStr);
                break;
            case JsonType.LitJson:
                data = JsonMapper.ToObject<T>(jsonStr);
                break;
        }

        //把对象返回出去
        return data;
    }
}

缺点


  • 重复工作繁多,自定义数据类,需要自己取实现存储读取的功能而且代码的相似度极高
  • 数据容易被修改,只要找到文件位置,就可以轻易的进行数据修改

⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


举报

相关推荐

0 条评论