XML设置写入和读取地图
时间:2021-09-01
本文章向大家介绍XML设置写入和读取地图,主要包括XML设置写入和读取地图使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
public class Menu : MonoBehaviour
{
private static int j = 1;
private static int k = 1;
/// <summary> 添加菜单栏(写入、保存) </summary>
[MenuItem("GetTransform/获得所有角色的位置设置XML &8")]
public static void SetSelectedObjPos()
{
//获得选中的Transfrom组件
Transform[] objs = Selection.transforms;
SaveName save = new SaveName();
for (int i = 0; i < objs.Length; i++)
{
SaveByXml(objs[i]);
//RecursiveSave(objs[i], save);
Debug.Log("保存完成");
}
}
/// <summary> 添加菜单栏(读取) </summary>
[MenuItem("GetTransform/从XML取得角色位置 &9")]
public static void GetSelectedObjPos()
{
//获得选中的Transfrom组件
Transform[] objs = Selection.transforms;
//地址
string filePath = Application.dataPath + "/byXML.txt";
//查看是否有文件
//TODO:还需检查是否名字和层级相同
//TODO:还需要检查视图是否一样
if (File.Exists(filePath))
{
//加载 XML 文档
XmlDocument xmlDoc = new XmlDocument();
//指定URL加载文档
xmlDoc.Load(filePath);
//选择XmlNode匹配(获得第一个节点)
XmlNode root = xmlDoc.SelectSingleNode("saveTransform ");
//获得root节点的所有子节点(所有第一层GameObject)
XmlNodeList nodeList = root.ChildNodes;
for (int i = 0; i < objs.Length; i++)
{
for (int j = 0; j < nodeList.Count; j++)
{
//将第一层的数据带入
//LoadByXml(nodeList[j], objs[i].GetChild(j));
LoadByXml(nodeList[j], objs[i]);
}
Debug.Log("加载游戏");
}
}
}
/// <summary> 创建Xml </summary>
public static void SaveByXml(Transform parent)
{
//创建 XML 文件的储存路径
string filePath = Application.dataPath + "/byXML.txt";
//如果XML文件已经存在,就删除
if (File.Exists(filePath))
{
File.Delete(filePath);
}
//创建 XML 文档
XmlDocument xmlDoc = new XmlDocument();
//创建跟节点,即最上层的节点
XmlElement root = xmlDoc.CreateElement("saveTransform");
//设置该节点的一个属性
root.SetAttribute("场景名称", EditorSceneManager.GetActiveScene().name);
XmlElement parentObject = xmlDoc.CreateElement("GameObject层级0");
XmlElement transformXml = xmlDoc.CreateElement("Transform");
//将Xml加入
TransformXml(parent, transformXml, xmlDoc);
parentObject.AppendChild(transformXml);
RecursiveAllObjs(parent, parentObject, xmlDoc);
root.AppendChild(parentObject);
xmlDoc.AppendChild(root);
xmlDoc.Save(filePath);
}
/// <summary> 获得节点 </summary>
private static void RecursiveAllObjs(Transform parent, XmlElement parentObject, XmlDocument xmlDoc)
{
for (int i = 0; i < parent.childCount; i++) //childCount的数量包括不显示的物体
{
//获得子物体的 Transform 位置
var temp = parent.GetChild(i);
//创建节点游戏物体
XmlElement gameObjectXml = xmlDoc.CreateElement("GameObject" + "层级" + j);
gameObjectXml.SetAttribute("名称", temp.name);
XmlElement transformXml = xmlDoc.CreateElement("Transform");
TransformXml(temp, transformXml, xmlDoc);
gameObjectXml.AppendChild(transformXml);
//将transformXml设置父节点为 root
parentObject.AppendChild(gameObjectXml);
//再次查询子类中的Transform。
if (temp.childCount > 0)
{
j++;
//迭代传入参数
RecursiveAllObjs(temp, gameObjectXml, xmlDoc);
j = 1;
}
}
}
/// <summary> 将Transform组件内容加入子类XML </summary>
private static void TransformXml(Transform parent, XmlElement transformXml, XmlDocument xmlDoc)
{
//创建节点position
XmlElement localPosition = xmlDoc.CreateElement("LocalPosition");
XmlElement localPositionX = xmlDoc.CreateElement("LocalPositionX");
XmlElement localPositionY = xmlDoc.CreateElement("LocalPositionY");
XmlElement localPositionZ = xmlDoc.CreateElement("LocalPositionZ");
localPositionX.InnerText = parent.localPosition.x.ToString();
localPositionY.InnerText = parent.localPosition.y.ToString();
localPositionZ.InnerText = parent.localPosition.z.ToString();
localPosition.AppendChild(localPositionX);
localPosition.AppendChild(localPositionY);
localPosition.AppendChild(localPositionZ);
//创建节点rotation
XmlElement localEulerAngles = xmlDoc.CreateElement("LocalEulerAngles");
XmlElement localEulerAnglesX = xmlDoc.CreateElement("LocalEulerAnglesX");
XmlElement localEulerAnglesY = xmlDoc.CreateElement("LocalEulerAnglesY");
XmlElement localEulerAnglesZ = xmlDoc.CreateElement("LocalEulerAnglesZ");
localEulerAnglesX.InnerText = parent.localEulerAngles.x.ToString();
localEulerAnglesY.InnerText = parent.localEulerAngles.y.ToString();
localEulerAnglesZ.InnerText = parent.localEulerAngles.z.ToString();
localEulerAngles.AppendChild(localEulerAnglesX);
localEulerAngles.AppendChild(localEulerAnglesY);
localEulerAngles.AppendChild(localEulerAnglesZ);
//创建节点scale
XmlElement localScale = xmlDoc.CreateElement("LocalScale");
XmlElement localScaleX = xmlDoc.CreateElement("LocalScale");
XmlElement localScaleY = xmlDoc.CreateElement("LocalScale");
XmlElement localScaleZ = xmlDoc.CreateElement("LocalScale");
localScaleX.InnerText = parent.localScale.x.ToString();
localScaleY.InnerText = parent.localScale.y.ToString();
localScaleZ.InnerText = parent.localScale.z.ToString();
localScale.AppendChild(localScaleX);
localScale.AppendChild(localScaleY);
localScale.AppendChild(localScaleZ);
//设置父节点transformXml
transformXml.AppendChild(localPosition);
transformXml.AppendChild(localEulerAngles);
transformXml.AppendChild(localScale);
}
/// <summary> 加载节点 </summary>
public static void LoadByXml(XmlNode noteData, Transform parent)
{
int j = 1;
XmlNodeList notes = noteData.ChildNodes;
//获得子物体的零号位都是Transform 位置
XmlNodeList transformData = notes[0].ChildNodes;
#region 初始化物体的Transfrom
//获得Transform的零号位都是Position
XmlNodeList LocalPositionData = transformData[0].ChildNodes;
parent.localPosition = new Vector3(float.Parse(LocalPositionData[0].InnerText), float.Parse(LocalPositionData[1].InnerText), float.Parse(LocalPositionData[2].InnerText));
//获得Transform的一号位都是Rotation
XmlNodeList LocalEulerAnglesData = transformData[1].ChildNodes;
parent.localEulerAngles = new Vector3(float.Parse(LocalEulerAnglesData[0].InnerText), float.Parse(LocalEulerAnglesData[1].InnerText), float.Parse(LocalEulerAnglesData[2].InnerText));
//获得Transform的二号位都是Rotation
XmlNodeList LocalScaleData = transformData[2].ChildNodes;
parent.localScale = new Vector3(float.Parse(LocalScaleData[0].InnerText), float.Parse(LocalScaleData[1].InnerText), float.Parse(LocalScaleData[2].InnerText));
#endregion
//判断物体是否还有子物体
if (notes.Count > 1)
{
//排除第一个Transform节点后开始循环每一个
for (int i = 1; i < notes.Count; i++)
{
j++;
var temp = parent.GetChild(i-1);
//获得的是GameObject
LoadByXml(notes[i], temp);
}
}
}
}
原文地址:https://www.cnblogs.com/zheyw/p/15214143.html
- React第三方组件6(状态管理之Mobx的使用④TodoList下)
- HDU 1536 S-Nim
- 洛谷P2723 丑数 Humble Numbers
- Python黑帽编程2.5 函数
- 洛谷P1317 低洼地
- ZOJ 3594 Sexagenary Cycle
- React第三方组件6(状态管理之Mobx的使用③TodoList中)
- P1554 梦中的统计
- Word2Vec教程-Skip-Gram模型模型“伪”任务关于模型的更多细节隐藏层输出层
- React第三方组件6(状态管理之Mobx的使用②TodoList上)
- The 9th Zhejiang Provincial Collegiate Programming Contest
- P1789 【Mc生存】插火把
- FOJFOJ有奖月赛-2012年4月(校赛热身赛)-解题报告总结
- poj 1316 Self Numbers
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一篇文章带你使用 Python搞定对 Excel 表的读写和处理(xlsx文件的处理)
- 从 rollup 初版源码学习打包原理
- leetcode树之相同的树
- Mysql Sql 语句练习题 (50道)
- 【每日一具16】来了!扫描图片批量漂白修正软件
- 实现一个 webpack loader 和 webpack plugin
- 万字长文带你走进 JavaScript 的世界
- windows中常见后门持久化方法总结
- Python3爬虫实战【点触验证码】 — 模拟登陆bilibili
- BOM 是个什么玩意!
- Educational Codeforces Round 81 (Rated for Div. 2) B - Infinite Prefixes
- python-利用python写一个购物小程序
- Java技巧收录一 那些你相见恨晚的快捷键和代码注释模板
- Educational Codeforces Round 81 (Rated for Div. 2) C.Obtain The String
- 深入了解 webpack 模块加载原理