首页 > 代码库 > 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或二进制并且解析还原场景
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。