Unity3D 游戏引擎之将场景导出XML或JSON或二进制并且解析还原场景

导出unity场景的所有游戏对象信息,一种是XML一种是JSON。本篇文章我们把游戏场景中游戏对象的、旋转、缩放、平移与Prefab的名称导出在XML与JSON中。然后解析刚刚导出的XML或JSON通过脚本把导出的游戏场景还原。在Unity官网上下载随便下载一个demo Project,如下图所示这是我刚刚在官网上下载的一个范例程序。

接着将层次视图中的所有游戏对象都封装成Prefab保存在资源路径中,这里注意一下如果你的Prefab绑定的脚本中有public Object 的话 ,需要在代码中改一下。。用 Find() FindTag()这类方法在脚本中Awake()方法中来拿,不然Prefab动态加载的时候无法赋值的,如下图所示,我把封装的Prefab对象都放在了Resources/Prefab文件夹下。

OK,现在我们就需要编写我们的导出工具、在Project视图中创建Editor文件夹,接着创建脚本MyEditor 。如下图所示。

因为编辑的游戏场景数量比较多,导出的时候我们需要遍历所有的游戏场景,一个一个的读取场景信息。然后取得游戏场景中所有游戏对象的Prefab的 名称 旋转 缩放 平移。有关XML的使用请大家看我的上一篇文章: unity3d研究院之使用 C#合成解析XML与JSON(四十一) 代码中我只注释重点的部分,嘿嘿。

  1 using UnityEngine;
  2
  3   using System.Collections;
  4
  5   using UnityEditor;
  6
  7   using System.Collections.Generic;
  8
  9   using System.Xml;
 10
 11   using System.IO;
 12
 13   using System.Text;
 14
 15   using LitJson;
 16
 17   public class MyEditor : Editor
 18
 19   {
 20
 21   //将所有游戏场景导出为XML格式
 22
 23   [MenuItem (“GameObject/ExportXML”)]
 24
 25   static void ExportXML ()
 26
 27   {
 28
 29   string filepath = Application.dataPath + @“/StreamingAssets/my.xml”;
 30
 31   if(!File.Exists (filepath))
 32
 33   {
 34
 35   File.Delete(filepath);
 36
 37   }
 38
 39   XmlDocument xmlDoc = new XmlDocument();
 40
 41   XmlElement root = xmlDoc.CreateElement(“gameObjects”);
 42
 43   //遍历所有的游戏场景
 44
 45   foreach (UnityEditor.EditorBuildSettingsScene S in UnityEditor.EditorBuildSettings.scenes)
 46
 47   {
 48
 49   //当关卡启用
 50
 51   if (S.enabled)
 52
 53   {
 54
 55   //得到关卡的名称
 56
 57   string name = S.path;
 58
 59   //打开这个关卡
 60
 61   EditorApplication.OpenScene(name);
 62
 63   XmlElement scenes = xmlDoc.CreateElement(“scenes”);
 64
 65   scenes.SetAttribute(“name”,name);
 66
 67   foreach (GameObject obj in Object.FindObjectsOfType(typeof(GameObject)))
 68
 69   {
 70
 71   if (obj.transform.parent == null)
 72
 73   {
 74
 75   XmlElement gameObject = xmlDoc.CreateElement(“gameObjects”);
 76
 77   gameObject.SetAttribute(“name”,obj.name);
 78
 79   gameObject.SetAttribute(“asset”,obj.name + “.prefab”);
 80
 81   XmlElement transform = xmlDoc.CreateElement(“transform”);
 82
 83   XmlElement position = xmlDoc.CreateElement(“position”);
 84
 85   XmlElement position_x = xmlDoc.CreateElement(“x”);
 86
 87   position_x.InnerText = obj.transform.position.x+“”;
 88
 89   XmlElement position_y = xmlDoc.CreateElement(“y”);
 90
 91   position_y.InnerText = obj.transform.position.y+“”;
 92
 93   XmlElement position_z = xmlDoc.CreateElement(“z”);
 94
 95   position_z.InnerText = obj.transform.position.z+“”;
 96
 97   position.AppendChild(position_x);
 98
 99   position.AppendChild(position_y);
100
101   position.AppendChild(position_z);
102
103   XmlElement rotation = xmlDoc.CreateElement(“rotation”);
104
105   XmlElement rotation_x = xmlDoc.CreateElement(“x”);
106
107   rotation_x.InnerText = obj.transform.rotation.eulerAngles.x+“”;
108
109   XmlElement rotation_y = xmlDoc.CreateElement(“y”);
110
111   rotation_y.InnerText = obj.transform.rotation.eulerAngles.y+“”;
112
113   XmlElement rotation_z = xmlDoc.CreateElement(“z”);
114
115   rotation_z.InnerText = obj.transform.rotation.eulerAngles.z+“”;
116
117   rotation.AppendChild(rotation_x);
118
119   rotation.AppendChild(rotation_y);
120
121   rotation.AppendChild(rotation_z);
122
123   XmlElement scale = xmlDoc.CreateElement(“scale”);
124
125   XmlElement scale_x = xmlDoc.CreateElement(“x”);
126
127   scale_x.InnerText = obj.transform.localScale.x+“”;
128
129   XmlElement scale_y = xmlDoc.CreateElement(“y”);
130
131   scale_y.InnerText = obj.transform.localScale.y+“”;
132
133   XmlElement scale_z = xmlDoc.CreateElement(“z”);
134
135   scale_z.InnerText = obj.transform.localScale.z+“”;
136
137   scale.AppendChild(scale_x);
138
139   scale.AppendChild(scale_y);
140
141   scale.AppendChild(scale_z);
142
143   transform.AppendChild(position);
144
145   transform.AppendChild(rotation);
146
147   transform.AppendChild(scale);
148
149   gameObject.AppendChild(transform);
150
151   scenes.AppendChild(gameObject);
152
153   root.AppendChild(scenes);
154
155   xmlDoc.AppendChild(root);
156
157   xmlDoc.Save(filepath);
158
159   }
160
161   }
162
163   }
164
165   }
166
167   //刷新Project视图, 不然需要手动刷新哦
168
169   AssetDatabase.Refresh();
170
171   }
172
173   //将所有游戏场景导出为JSON格式
174
175   [MenuItem (“GameObject/ExportJSON”)]
176
177   static void ExportJSON ()
178
179   {
180
181   string filepath = Application.dataPath + @“/StreamingAssets/json.txt”;
182
183   FileInfo t = new FileInfo(filepath);
184
185   if(!File.Exists (filepath))
186
187   {
188
189   File.Delete(filepath);
190
191   }
192
193   StreamWriter sw = t.CreateText();
194
195   StringBuilder sb = new StringBuilder ();
196
197   JsonWriter writer = new JsonWriter (sb);
198
199   writer.WriteObjectStart ();
200
201   writer.WritePropertyName (“GameObjects”);
202
203   writer.WriteArrayStart ();
204
205   foreach (UnityEditor.EditorBuildSettingsScene S in UnityEditor.EditorBuildSettings.scenes)
206
207   {
208
209   if (S.enabled)
210
211   {
212
213   string name = S.path;
214
215   EditorApplication.OpenScene(name);
216
217   writer.WriteObjectStart();
218
219   writer.WritePropertyName(“scenes”);
220
221   writer.WriteArrayStart ();
222
223   writer.WriteObjectStart();
224
225   writer.WritePropertyName(“name”);
226
227   writer.Write(name);
228
229   writer.WritePropertyName(“gameObject”);
230
231   writer.WriteArrayStart ();
232
233   foreach (GameObject obj in Object.FindObjectsOfType(typeof(GameObject)))
234
235   {
236
237   if (obj.transform.parent == null)
238
239   {
240
241   writer.WriteObjectStart();
242
243   writer.WritePropertyName(“name”);
244
245   writer.Write(obj.name);
246
247   writer.WritePropertyName(“position”);
248
249   writer.WriteArrayStart ();
250
251   writer.WriteObjectStart();
252
253   writer.WritePropertyName(“x”);
254
255   writer.Write(obj.transform.position.x.ToString(“F5”));
256
257   writer.WritePropertyName(“y”);
258
259   writer.Write(obj.transform.position.y.ToString(“F5”));
260
261   writer.WritePropertyName(“z”);
262
263   writer.Write(obj.transform.position.z.ToString(“F5”));
264
265   writer.WriteObjectEnd();
266
267   writer.WriteArrayEnd();
268
269   writer.WritePropertyName(“rotation”);
270
271   writer.WriteArrayStart ();
272
273   writer.WriteObjectStart();
274
275   writer.WritePropertyName(“x”);
276
277   writer.Write(obj.transform.rotation.eulerAngles.x.ToString(“F5”));
278
279   writer.WritePropertyName(“y”);
280
281   writer.Write(obj.transform.rotation.eulerAngles.y.ToString(“F5”));
282
283   writer.WritePropertyName(“z”);
284
285   writer.Write(obj.transform.rotation.eulerAngles.z.ToString(“F5”));
286
287   writer.WriteObjectEnd();
288
289   writer.WriteArrayEnd();
290
291   writer.WritePropertyName(“scale”);
292
293   writer.WriteArrayStart ();
294
295   writer.WriteObjectStart();
296
297   writer.WritePropertyName(“x”);
298
299   writer.Write(obj.transform.localScale.x.ToString(“F5”));
300
301   writer.WritePropertyName(“y”);
302
303   writer.Write(obj.transform.localScale.y.ToString(“F5”));
304
305   writer.WritePropertyName(“z”);
306
307   writer.Write(obj.transform.localScale.z.ToString(“F5”));
308
309   writer.WriteObjectEnd();
310
311   writer.WriteArrayEnd();
312
313   writer.WriteObjectEnd();
314
315   }
316
317   }
318
319   writer.WriteArrayEnd();
320
321   writer.WriteObjectEnd();
322
323   writer.WriteArrayEnd();
324
325   writer.WriteObjectEnd();
326
327   }
328
329   }
330
331   writer.WriteArrayEnd();
332
333   writer.WriteObjectEnd ();
334
335   sw.WriteLine(sb.ToString());
336
337   sw.Close();
338
339   sw.Dispose();
340
341   AssetDatabase.Refresh();
342
343   }
344
345   }

原文链接:http://www.unitymanual.com/thread-36576-1-1.html?_dsign=ad7267e6

时间: 2024-11-10 02:04:19

Unity3D 游戏引擎之将场景导出XML或JSON或二进制并且解析还原场景的相关文章

将场景导出XML或JSON或二进制并且解析还原场景

导出unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平移与Prefab的名称导出在XML与JSON中.然后解析刚刚导出的XML或JSON通过脚本把导出的游戏场景还原.在Unity官网上下载随便下载一个demo Project,如下图所示这是我刚刚在官网上下载的一个范例程序. 接着将层次视图中的所有游戏对象都封装成Prefab保存在资源路径中,这里注意一下如果你的Prefab绑定的脚本中有public Object 的话 ,需要在代码中

(转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景

自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平移与Prefab的名称导出在XML与JSON中.然后解析刚刚导出的XML或JSON通过脚本把导出的游戏场景还原.在Unity官网上下载随便下载一个demo Project,如下图所示这是我刚刚在官网上下载的一个范例程序.           接着将层次视图中的所有游戏对象都封装成Prefab保存在资

将场景导出XML或JSON或二进制而且解析还原场景

导出unity场景的全部游戏对象信息,一种是XML一种是JSON. 本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平移与Prefab的名称导出在XML与JSON中.然后解析刚刚导出的XML或JSON通过脚本把导出的游戏场景还原.在Unity官网上下载随便下载一个demo Project.例如以下图所看到的这是我刚刚在官网上下载的一个范例程序. 接着将层次视图中的全部游戏对象都封装成Prefab保存在资源路径中,这里注意一下假设你的Prefab绑定的脚本中有public Object 的话 ,须

Unity3D游戏引擎实战开发视频教程

Unity3D游戏引擎实战开发从入门到精通(坦克大战项目实战.NGUI开发.GameObject) 适合人群:初级 课时数量:20课时 用到技术:Unity3D.VS2008.NGUI2.61.GameObject 涉及项目:坦克大战项目实战 咨询qq:1840215592 课程内容简介 Unity3D游戏引擎实战开发从入门到精通课程由浅入深的介绍Unity3D的开发流程.从软件使用到API接口的使用,从成品到优化.介绍整个Unity3D的基本开发过程及开发中碰到的基础问题进行深入讲解.对代码重

C#.NET序列化XML、JSON、二进制微软自带DLL与newtonsoft(json.net)

序列化是将对象转换成另一种格式(XML.json.二进制byte[]) JSON序列化 .NET中有三种常用的JSON序列化的类,分别是: Newtonsoft.Json.JsonConvert类(推荐) Newtonsoft.Json.JsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是:http://www.codeplex.com/json/),它提供了更灵活的序列化和反序列化控制,并且如果你的开发环境使用的是.NET Framework3.5及以后

Unity3D 场景导出成 XML 并解析还原场景

为了尽可能加快从网络加载场景,我们通常可以把场景先导出成 XML,把优先级高的资源优先加载并显示(地形等),把可以进入场景之后再加载的对象放到最后(比如场景里面的怪物等),本篇一部分代码引用自:http://www.xuanyusong.com/archives/1919,导出场景部分在原作者的代码基础进行了优化,并且整理成了更加方便,容易使用的类库. 先来搭建测试场景(测试场景来源网络),并整理场景中的对象,如图: 然后把场景中的对象都设置成预设,方便打包成 assetbundle 文件(如何

第一章-第二题Unity3D游戏引擎相关--By林培文

1) 此类软件是什么时候开始出现的, 这些软件是怎么说服你(陌生人)成为他们的用户的?  他们的目标都是盈利么?  他们的目标都是赚取用户的现金么?还是别的? 2004年,Unity3D诞生于丹麦哥本哈根,05年将总部设在了美国旧金山,并发布了Unity 1.0版本,支持MAC平台.随后几年,Unity3D陆续Windows.IOS及Android等平台,至2011构建完PS3和XBOX360,标志其全平台的构建完成.(参考<Unity诞生于发展> link:http://www.leipho

主流游戏引擎分析 【端游 、页游 、手游 解析】

该分享仅供参考,目的是提升大家对游戏引擎方面的一些认知.文档中部分内容收集于互联网,若有内容不准确,还请告知. 关于本文PPT文档:github 一.介绍 游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些互交式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程序而不用由零开始.大部分都支持多种操作系统平台,如Linux.Mac OS X.微软Windows.游戏引擎包含以下系统:渲染引擎(即"渲染器",含二

C#对XML、JSON等格式的解析

一.C#对XML格式数据的解析 1.用XMLDocument来解析 [csharp] view plain copy XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load("test.xml"); //创建新节点 XmlElement nn = xmlDocument.CreateElement("image"); nn.SetAttribute("imageUrl", &qu