Unity—JsonFx序列化场景

场景数据类:

/// <summary>

/// 关卡数据

/// </summary>

public class LevelData

{

//关卡名称

public string levelName;

//物体列表

public List<DataType> objectsToData = new List< DataType>();

public void AddObj(string prefabName, GameObject obj)

{

DataType data = new DataType(prefabName, obj.transform.position, obj.transform.eulerAngles, obj.transform.localScale);

objectsToData.Add(data);

}

}

/// <summary>

/// 物体数据,pos,rot,scale

/// </summary>

public class DataType

{

public string prefabName;

public float posX;

public float posY;

public float posZ;

public float rotX;

public float rotY;

public float rotZ;

public float scaleX;

public float scaleY;

public float scaleZ;

public DataType()

{

}

public DataType( string name, Vector3 position, Vector3 rotation, Vector3 scale)

{

prefabName = name;

posX = position.x;

posY = position.y;

posZ = position.z;

rotX = rotation.x;

rotY = rotation.y;

rotZ = rotation.z;

scaleX = scale.x;

scaleY = scale.y;

scaleZ = scale.z;

}

public Vector3 GetPos()

{

return new Vector3(posX, posY, posZ);

}

public Vector3 GetRotation()

{

return new Vector3(rotX, rotY, rotZ);

}

public Vector3 GetScale()

{

return new Vector3(scaleX, scaleY, scaleZ);

}

}

序列化场景物体:

public class SerializeScene : ScriptableWizard

{

string assetPath;

[MenuItem("Tools/Serialize Scene")]

static void SerializeOpenScene()

{

SerializeScene ss = (SerializeScene)ScriptableWizard .DisplayWizard("Serialize Scene", typeof(SerializeScene ));

}

void OnWizardCreate()

{

// Get the path we‘ll use to write our assets:

assetPath = Application.dataPath + "/Resources/" + "SceneInfo/" ;

// Create the folder that will hold our assets:

if (! Directory.Exists(assetPath))

{

Directory.CreateDirectory(assetPath);

}

FindAssets();

// Make sure the new assets are (re-)imported:

AssetDatabase.Refresh();

}

private void FindAssets()

{

List< GameObject> objList = new List <GameObject >();

LevelData newLevel = new LevelData();

newLevel.levelName = SceneManager.GetActiveScene().name;

GameObject parent = GameObject .Find( "ObjectRoot" );

if (parent == null)

{

Debug.LogError( "No ObjectRoot Node!");

return;

}

foreach ( Transform trans in parent.transform)

{

Debug.Log(trans.name);

AddObjects(trans.name, trans.gameObject, ref newLevel);

}

string json = JsonFx.Json. JsonWriter.Serialize(newLevel);

FileInfo file = new FileInfo(assetPath + newLevel.levelName + ".txt");

try

{

file.Delete();

}

catch (System.IO. IOException e)

{

Debug.Log(e.Message);

}

FileStream fs = new FileStream (assetPath + newLevel.levelName + ".txt", FileMode.OpenOrCreate, FileAccess .Write);

StreamWriter sw = new StreamWriter (fs);

sw.Write(json);

sw.Close();

fs.Close();

}

private void AddObjects( string prefabName, GameObject obj, ref LevelData level)

{

if ( PrefabType.PrefabInstance == PrefabUtility .GetPrefabType(obj))

{

level.AddObj(prefabName, obj);

}

else

{

Debug.Log( "Not a Prefab!");

}

}

}

序列化场景物体之前需要将ObjectRoot节点下的物体存为prefab,再到菜单中选择Tools-->Serialize Scene,在弹出的界面中点击create按钮即可生成当前场景的Json文件。

插件链接: http://pan.baidu.com/s/1jIgzRyY 密码: djqt

JsonFX GitHub:https://github.com/jsonfx/jsonfx

参考:1.http://www.cnblogs.com/sifenkesi/p/3597106.html

   2.http://zaxisgames.blogspot.com/2012/01/minimizing-build-size-in-unity-games.html

时间: 2024-10-12 23:28:47

Unity—JsonFx序列化场景的相关文章

Unity进度条场景载入的制作思路

有两种做法,如果全部都是AssetsBundle动态载入,可以自己管控加载和释放.还有一种是借助Unity的Level(场景). 如果直接A-B场景切换,我比较担心加载峰值过高,所以采取这种做法:A-L-B.L是进度条专用场景 第一个问题是如何检测,OnLevelWasLoaded可以判断是否新场景加载完了,并调用Application.LoadLevelAsync(...)进行加载,可以通过返回对象获取到加载进度 使用时发现一个比较奇怪的事情,当场景很小秒载的时候,加载进度条执行OnDestr

【Unity入门】场景、游戏物体和组件的概念

版权声明:本文为博主原创文章,转载请注明出处. 游戏和电影一样,是通过每一个镜头的串联来实现的,而这样的镜头我们称之为“场景”.一个游戏一般包含一个到多个场景,这些场景里面实现了不同的功能,把它们组合起来就变成一个完整的游戏了.  在电影里面,每个镜头会包含布景,然后还会有演员在表演,摄像机将表演的画面记录下来,然后就变成了电影.同样的,在Unity游戏里面也同样存在相机,它的作用也是将游戏的画面展示在游戏设备的显示屏上面.所不同的是,Unity游戏里面,不论是布景还是人物,所有的东西我们都称之

Unity中序列化和反序列化

为了满足面向对象中的封装性,我们通常使用private关键字使变量私有化,让外界无法访问修改,起到保护作用. 但是一些特殊情况,我们希望在Unity中Inspector面板中修改到脚本组件中的私有成员.Unity为我们提供了序列化和反序列化. 序列化:利用关键字 [SerializeField] 让私有成员在Inspector面板上显示出来. 反序列化:利用关键字 [System.NonSerialized] 让公有成员不在在Inspector面板上显示出来.(只让其他对象通过脚本来进行访问)

Unity多个场景叠加或大场景处理方法小结

本文章由cartzhang编写,转载请注明出处. 所有权利保留.  文章链接: http://blog.csdn.net/cartzhang/article/details/47614153 作者:cartzhang 本想写个总结,奈何刚刚接触! 对于Unity中对象,多个场景或大的场景多人分割处理,有不能同时修改一下场景来提交. 这怎么办呢? 方法一,建立Prefab 把某个对象或需要多场景下使用的对象建立一个prefab对象,这样就可以在多场景下使用. 方法二,有高人自有办法 就是自己写了个

unity 3D游戏场景转换

//////////////////2015/07/07//////// /////////////////by xbw/////////////// ///////////////环境 unity 4.6.1// 当需要多个场景时,就用到了场景转换, 这里呢,我有两个场景,一个move(开场镜头),另一个second(游戏场景): 要想运行完开长镜头后接着运行游戏场景,需要用到一个函数::: Application.LoadLevel("second");引号里变是需要运行的场景,即

Unity跳转场景

Unity中如何加载场景 1.首先需要将场景添加到 Build Settings中,如下图: 2.引用using UnityEngine.SceneManagement; 同步加载:如果场景很大,有可能会卡顿. 1 using UnityEngine; 2 using UnityEngine.SceneManagement; 3 4 public class TestA : MonoBehaviour 5 { 6 private void Start() 7 { 8 SceneManager.L

unity, 鼠标与场景交点

在鼠标与场景交点上放一个mark,并于1s后消失: 新建一个空GameObject,命名为moushHitTest,添加下面脚本: using UnityEngine;using System.Collections; public class mouseHit : MonoBehaviour {    public GameObject m_moushHitMarkPrefab;    // Use this for initialization    void Start () {     

HoloLens开发手记 - Unity之Persistence 场景保持

Persistence 场景保持是HoloLens全息体验的一个关键特性,当用户离开原场景中时,原场景中全息对象会保持在特定位置,当用户回到原场景时,能够准确还原原场景的全息内容.WorldAnchorStore类是实现此特性的关键API,这保证了用户能够将任何全息对象贴到任何他们想要放置的位置. How to persist holograms across sessions 如何在整个会话中保持全息对象 WorldAnchorStore能够允许你保持场景中空间锚的位置,为了能够真正保持全息对

unity 背景 按钮 场景跳转

public Texture2D pic; private bool Cl = false; void OnGUI() { GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), pic); GUIStyle style = new GUIStyle(); //实例化一个新的GUIStyle,名称为style ,后期使用 style.fontSize = 50; //字体的大小设置数值越大,字越大,默认颜色为黑色 style.no