场景数据类:
///
<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