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

posted @ 2015-01-27 11:37  【Winco】  阅读(760)  评论(0编辑  收藏  举报