Unity Json实现场景数据存储和数据还原


前言

  • 在场景里面创建一些物体,然后把场景里的物体数据存入Json文本。接着读取json文本里的信息放到unity

场景物体数据存储

  1. 在场景里创建几个物体并且改变形状位置等
  2. 创建一个脚本,先拿到单个物体的数据,包含大小角度坐标名字
  • ObjectVO代表一个物体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
[Serializable]

public class ObjectVO
{
    public Vector3 pos;
    public Vector3 rot;
    public Vector3 sca;
    public string name;
}

  1. 再创建一个脚本,将多个物体存入,以数组的形式
  2. 这两个脚本可以并入一个脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class DataVO
{
    public List<ObjectVO> listObjs = new List<ObjectVO>();
}

  1. 最后创建脚本,写入物体信息
  • Selection类是选择场景物体,
  • Selection.activeObject 选择某一个物体,返回值是object
  • Selection.activeGameObject 选择的是某一个游戏物体 返回值是gameobject
  • Selection.gameObjects 选择所有的物体 返回的是gameobject的数组
  • 接着使用for循环读取物体的数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;

public class WriteJson
{
    [MenuItem("Tools/WriteJson")]
    static void Write()
    {
        string path = Application.dataPath + "/MyJson.json";
        GameObject[] objs= Selection.gameObjects;
        DataVO data = new DataVO();
        for (int i = 0; i < objs.Length; i++)
        {
            ObjectVO obj = new ObjectVO();
            obj.name = objs[i].name;
            obj.pos = objs[i].transform.position;
            obj.rot = objs[i].transform.eulerAngles;
            obj.sca = objs[i].transform.localScale;
            data.listObjs.Add(obj);
        }
        string s= JsonUtility.ToJson(data);
        File.WriteAllText(path, s);
    }
}

  • 回到unity,选中三个物体,点击Tools里面的WriteJson,这个是为了方便测试不用点击运行的一个方法,之后会出一篇文章说明,相当于点击了运行。
    在这里插入图片描述

  • 右击Assets刷新,里面多了一个json文档,存入的是选中三个物体的信息,
    在这里插入图片描述

场景物体数据还原

  1. 创建一个脚本,读取刚才存入的物体信息放入unity
  2. 先把之前创建的三个物体失活,
  3. GameObject.CreatePrimitive方法创建Unity 3D系统自带的基本游戏对象,参数要的是枚举值,我们可以拿到json里面物体的名字,是字符串,所以要将字符串转换成枚举
  4. obj就是上面的方法创建出来的对象,接下来读取数据然后赋值。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System;

public class ReadJson   {
    [MenuItem("Tools/ReadJson")]
	static void Read()
    {
        string path = Application.dataPath + "/MyJson.json";
        string s = File.ReadAllText(path);
        DataVO data = JsonUtility.FromJson<DataVO>(s);
        for (int i = 0; i < data.listObjs.Count; i++)
        {
            GameObject obj= GameObject.CreatePrimitive((PrimitiveType)Enum.Parse(typeof(PrimitiveType), data.listObjs[i].name));
            obj.transform.position = data.listObjs[i].pos;
            obj.transform.eulerAngles = data.listObjs[i].rot;
            obj.transform.localScale = data.listObjs[i].sca;
            
        }
        AssetDatabase.Refresh();
    }
}


  • 回到unity,不用选择场景的物体,直接点击ReadJson
    在这里插入图片描述

在这里插入图片描述

  • 读入的物体和之前的一样
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X在学了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值