首页 > 代码库 > Unity3D 游戏引擎之将场景导出XML或JSON或二进制并且解析还原场景

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

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