static SceneConfig GetSceneConfig(uint sceneID) { SceneConfig sceneConfig = new SceneConfig(); sceneConfig.Objects = new List <SceneConfig.SceneObject>(); for (int i = 0; i < _levelConfigArray.items.Count; i++) { if (_levelConfigArray.items[i].ID != sceneID) { continue; } string scenePath = "Assets/" + GetAssetPathByResConfig(_levelConfigArray.items[i].LevelResID) + ".xml"; XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(scenePath); XmlNodeList parentList = xmldoc.GetElementsByTagName("SceneInfo"); for (int j = 0; j < parentList.Count; j++) { XmlNodeList childs = parentList[j].ChildNodes; foreach (XmlElement el in childs) { SceneConfig.SceneObject sceneObject = new SceneConfig.SceneObject(); if (el.Name.Equals("Object")) { sceneObject.Path = el.GetAttribute("Path"); sceneConfig.Objects.Add(sceneObject); } } } } return(sceneConfig); }
public static void GenerateSceneFile(Scene scene) { string sceneName = scene.name; string xmlFileName = PathConstant.PathName.DYNAMIC_SCENE_CONFIG_FILE_PATH + sceneName + ".xml"; string sceneFolder = PathConstant.PathName.DYNAMIC_SCENE_PREFAB_PATH + sceneName; if (!Directory.Exists(sceneFolder)) { Directory.CreateDirectory(sceneFolder); AssetDatabase.Refresh(); } XmlDocument xmldoc = new XmlDocument(); XmlDeclaration declaration = xmldoc.CreateXmlDeclaration("1.0", "utf-8", string.Empty); xmldoc.AppendChild(declaration); XmlElement root = xmldoc.CreateElement("SceneInfo"); xmldoc.AppendChild(root); XmlElement element = xmldoc.CreateElement("SceneName"); element.InnerText = sceneName; root.AppendChild(element); GameObject[] objects = scene.GetRootGameObjects(); SceneConfig sceneConfig = new SceneConfig(); List <GameObject> gameObjects = new List <GameObject>(); for (int j = 0; j < objects.Length; j++) { GameObject @object = objects[j]; SceneConfig.SceneObject sceneObject = new SceneConfig.SceneObject(); sceneObject.Px = @object.transform.position.x; sceneObject.Py = @object.transform.position.y; sceneObject.Pz = @object.transform.position.z; sceneObject.Rx = @object.transform.eulerAngles.x; sceneObject.Ry = @object.transform.eulerAngles.y; sceneObject.Rz = @object.transform.eulerAngles.z; sceneObject.Sx = @object.transform.localScale.x; sceneObject.Sy = @object.transform.localScale.y; sceneObject.Sz = @object.transform.localScale.z; Object prefab = PrefabUtility.GetPrefabObject(@object); if (prefab == null) { string prefabPath = sceneFolder + "/" + @object.name + ".prefab"; sceneObject.Path = prefabPath.Substring("Assets/".Length, prefabPath.Length - "Assets/".Length); PrefabUtility.CreatePrefab(prefabPath, @object); } sceneConfig.SceneName = sceneName; sceneConfig.Objects.Add(sceneObject); XmlElement objectsXml = xmldoc.CreateElement("Object"); objectsXml.SetAttribute("Name", @object.name); objectsXml.SetAttribute("Path", sceneObject.Path); root.AppendChild(objectsXml); XmlElement position = xmldoc.CreateElement("Position"); objectsXml.AppendChild(position); position.SetAttribute("X", sceneObject.Px.ToString()); position.SetAttribute("Y", sceneObject.Py.ToString()); position.SetAttribute("Z", sceneObject.Pz.ToString()); XmlElement rotate = xmldoc.CreateElement("Rotate"); objectsXml.AppendChild(rotate); rotate.SetAttribute("X", sceneObject.Rx.ToString()); rotate.SetAttribute("Y", sceneObject.Ry.ToString()); rotate.SetAttribute("Z", sceneObject.Rz.ToString()); XmlElement scale = xmldoc.CreateElement("Scale"); objectsXml.AppendChild(scale); scale.SetAttribute("X", sceneObject.Sx.ToString()); scale.SetAttribute("Y", sceneObject.Sy.ToString()); scale.SetAttribute("Z", sceneObject.Sz.ToString()); gameObjects.Add(@object); } EditorSceneManager.SaveScene(scene); xmldoc.Save(xmlFileName); for (int i = 0; i < gameObjects.Count; i++) { GameObject.DestroyImmediate(gameObjects[i]); } AssetDatabase.Refresh(); }