Exemple #1
0
    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();
    }