导出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