想要用unity3d xml读写做游戏,有人推荐用xml写存档,求教

C#是微软公司在2000年7月发布的一种全新且简单、安全、面向对象的程序设计语言,是专门为.NET的应用而开发的语言,并且做为Unity3d的脚本语言之一,。它吸收了C++、Visual Basic、Delphi、Java等语言的优点,体现了当今最新的程序设计技术的功能和精华。C#继承了C语言的语法风格,同时又继承了C++的面向对象特性。课程全面讲述了C#基础知识,带您进入C#的精彩世界, 了解C#的基础知识及如何快速学习C#,课程内容主要分为以下几部分。
1. C#基础语法,流程控制语句。(变量的定义,数据的类型,字符串处理,集合的处理)
2. C#的面向对象编程(类的定义,方法的应用,四种传参方法,字段的封装,方法的重构,类的继承,静态类,抽象类,接口等)
3. C#的IO处理,事件委托,多线程开发,异常处理等
4. C#对于XML的处理(游戏有可能有Xml的配置文件,需要读取操作)
个人介绍:
钟勇:多年一线.net开发经验以及软件培训经验,成都微软技术中心技术专家之一,国家信息安全产业基地(西部)技术顾问。精通c#技术,php技术,参与项目涉及电子政务系统、网上银行、ERP、CRM、OA等。
预计学习时长:7天
从零开始一步一步讲解Unity3D,介绍引擎的方方面面,在学习完本课程后,同学们能熟悉合和了解整个Unity3D的操作流程和方法,能正式开始游戏项目的研发了。
预计学习时长:7天
从零开始一步一步讲解Unity3D,介绍引擎的方方面面,在学习完本课程后,同学们能熟悉合和了解整个Unity3D的操作流程和方法,能正式开始游戏项目的研发了.
预计学习时长:7天
Unity3D是当前最流行的次世代3D游戏引擎之一,它强大高效跨平台,是当前全球多款3D游戏(PC或移动端)采用的引擎。本套课程基于学员已经对U3D有了最基本的了解和使用知识,并期望能充分运用U3D提供的基本组件开发一个完整的游戏客户端。
本课程将全面的讲解U3D各种基本组件的使用方法,更重要的是其背后的实现原理,性能以及在实际项目中的应用经验,并逐步串联出一个基本的游戏demo。
预计学习时长:7天
该课程学习如何控制角色,以及处理游戏场景内的物理相关的情况,同时学习如何给我们的场景添加粒子特效,学习完成后就能灵活控制我们的角色,同时知道如何处理碰撞或者其他运动的情况,学会粒子系统过后能让我们的场景绚丽和丰富起来。
预计学习时长:7天
从零开始一步一步讲解Unity3D,介绍引擎的方方面面,在学习完本课程后,同学们能熟悉合和了解整个Unity3D的操作流程和方法,能正式开始游戏项目的研发了。
预计学习时长:7天
这是一门Unity3D的高级课题课程,在企业中有着广泛的应用。本课程主要介绍Unity3D里面的动画系统_Mecanim。通过本课程可以了解学习Unity3D中动画处理的细节。实现在项目中对动画需求的处理。
预计学习时长:7天
了解UGUI的常用控件使用、事件系统、实现原理,可以使用UGUI进行二次开发,快速学会游戏界面开发。
预计学习时长:7天
Unity3D是当前最流行的次世代3D游戏引擎之一,它强大高效跨平台,是当前全球多款3D游戏(PC或移动端)采用的引擎。本套课程基于学员已经对U3D有了最基本的了解和使用知识,并期望能充分运用U3D提供的基本组件开发一个完整的游戏客户端。
本课程将全面的讲解U3D各种基本组件的使用方法,更重要的是其背后的实现原理,性能以及在实际项目中的应用经验,并逐步串联出一个基本的游戏demo。
预计学习时长:7天
通过全面介绍Unity的官方使用手册,让学员对使用Unity3D的开发基础有扎实的了解,对Unity3D引擎的每个主要部分有全面的掌握,进而可以使用Unity3D开发3D客户端游戏。
预计学习时长:7天
这门课程通过深入浅出的方式讲解游戏AI的理论、设计原则与实现方法,让你学会如何设计开发出“更高智能”的游戏角色。
预计学习时长:7天
已更新:12章
这是一门讲解3D基础数学的课程。3D是构建在数学之上,因此3D基础数学是学习3D必须的课程。通过本课程,帮助大家了解如何通过数学来构建一个虚拟的3D世界,了解编程中各种3D运算背后实现原理。最后在实战中模拟各个有关3D运算的API实现。
预计学习时长:7天
这是一门讲解3D基础渲染的课程。详细讲解了一个模型从载入到上传至GPU绘制的过程。透析3D渲染的底层实现原理,旨在帮助学员掌握底层原理方便在以后的开发中快速解决问题。最后在实战中使用CPU模拟GPU的渲染加深学员对渲染的理解。
预计学习时长:7天
3D纹理映射。
预计学习时长:7天
详细介绍3D中关于深度的概念,深度测试的算法以及原理,在实战中因为深度引发的一系列问题,同时还配合深度讲解了混合的原理、混合的方程、混合的系数以及混合在实战如何使用。
预计学习时长:7天
这是一门Unity网络编程课程,目标是让你把知识从不知到了解到熟悉到应用的过程,掌握一些网络编程的知识在实际商业项目开发中的应用。
预计学习时长:7天
我们玩过的游戏中,神优化和渣优化的案例都不胜枚举,它们直接影响着玩家们的游戏体验。本套课程将从最基础的概念开始,配合实例讲解各种优化的技巧,最终建立起一套属于自己的优化方法,完成对游戏项目的评估和优化工作。
预计学习时长:7天
本课程将详细讲解导航网格的基本原理及基于Unity3D实现导航系统的详细步骤,参数调节,以及各种特殊导航技术的操作,还将讲解动态导航和导航优化等高阶技术,使学生对使用Unity3D的导航系统实现由完整和深刻的掌握。
预计学习时长:7天
这是一门Unity结合Kinect进行开发的实战课程,目标是让你了解Kinect开发的过程以及Unity如何结合Kinect进行游戏的高效开发,让你掌握两者结合的开发技巧。
预计学习时长:7天
本套视频教程将从实践的角度带你学习Unity3D。在使用中逐步了解如何自己开发一款游戏。
预计学习时长:7天
随着手游市场的崛起,越来越多的学员想学习游戏开发技术,进而开发自己的游戏。而相对于其他游戏引擎来说,Unity3D拥有丰富的插件,友好的开发编辑环境,对多平台的适应度高等游戏。因此Unity3D备受开发人员青睐。
学完本课程之后,学员将掌握Unity UGUI控件使用,UI交互界面搭建与逻辑编写,掌握Unity常用API及Unity游戏编写流程,熟悉unity游戏编程相关技巧。通过实战,为学员搭建从菜鸟到高手的桥梁。
预计学习时长:7天
本套课程将实际讲解一个基于Unity3D的小的客户端demo《坦克大战》的制作过程,希望通过本套课程使同学掌握这些知识:
1.使用Unity3d完成一个较完整的客户端游戏demo
2.能够将demo在手机上运行
3.在游戏中运用Unity3D的一些主要技术:摄像机,动态光照和阴影,烘培,动画系统,粒子系统,碰撞检测,UI显示,简单的ai,脚本编写,以及打包发布等
预计学习时长:7天
学习Unity3D最常用且好用的UI插件,学习完成之后几乎能够应对所有的游戏制作,从UI的基础讲解开始直到一些高级的实践项目应用,能在这里学习到实际项目开发中的UI制作方法和流程规范,能够方便大家快速上手,哪怕是没有程序经验的美术同学学习完成之后也可以进行Unity的UI制作。
预计学习时长:7天
NGUI插件项目实战 。
预计学习时长:7天
已更新:9章
本期课程主要是学习通过用unity3D制作一些基础特效,主要针对零基础想学习u3d特效的同学们,通过学习之后能够熟练使用u3d,然后可以独立完成一些u3d项目。
预计学习时长:7天
讲解着色器基本语法、着色器基本的运算规则、函数等。结合Unity3D讲解一些常用的着色器实例。
预计学习时长:7天
本课程会带领大家了解Unity3D中一些相关插件的开发,让大家在以后的项目开发中能自主的开发一些插件,提升项目的开发效率以及开发质量
预计学习时长:7天
本课程将主要讲解基于Unity3D进行底层插件开发的原理和基本操作过程,以及sdk的接入。通过讲解使学生掌握Windows和Android平台上c#代码和平台native代码之间的各种交互,并且以棱镜sdk为例让学生了解什么是游戏sdk以及在Unity3D上的接入方法。
预计学习时长:7天
已更新:23章
跑酷项目实战可以让同学们了解到完整项目的开发流程,以及开发过程中需要注意的一些重要事项,能帮助同学们在实战过程中积累经验,避免踩到很多的坑。
预计学习时长:7天
第一阶段:Unity3D概要及入门
第二阶段:Unity3D进阶学习
第三阶段:Unity3D项目开发实战
第四阶段:Unity3D选修
Copyright (C)
麦子学院 All Right Reserved. 蜀ICP备号-4
服务热线:400-862-8862
还没有账号?
其他方式登录
滑动完成验证
重发验证码
手机短信验证码已发送,请查收!
有一位课程导师想与你聊聊Unity3d存档例子 -
这是场景存储的信息类,创建好不管它
using&UnityE&
using&System.C&
[SerializeField]public class Sence//场景存储的变量放这个类里&
&&&&& Public Vector3
cubeP //Cube位置信息
这是GameDataManager类,游戏日志控制器。
using&UnityE&
using&System.C&
using&System.IO;&
using&System.Collections.G&
using&System.T&
using&System.X&
using&System.Security.C&
//GameData,储存数据的类,把需要储存的数据定义在GameData之内就行//&
public&class&GameData&
&&&&//密钥,用于防止拷贝存档//&
&&&&public&string&&
&&&&//下面是添加需要储存的内容//&
&&&&public&bool&isDu;//点击读档为True,加载场景后为False
&&&&//场景存储内容
&&&&public&Sence&s;
&&&&public&GameData()&
&&&&&&&&s&=&new&Sence&();//存储内容初始化,只能放构造函数
&&&&&&&&isDu&=&
//管理数据储存的类//&
public&class&GameDataManager:MonoBehaviour&
&&&&private&string&dataFileName&="tankyWarData.dat";//存档文件的名称,自己定//&
&&&&private&&XmlSaver&xs&=&new&XmlSaver();&
&&&&public&&GameData&gameD&
&&&&public&void&Awake()&
&&&&&&&&gameData&=&new&GameData();&
&&&&&&&&//设定密钥,根据具体平台设定//&
&&&&&&&&gameData.key&=&SystemInfo.deviceUniqueI&
&&&&&&&&Load();&
&&&&//存档时调用的函数//&
&&&&public&&void&Save()&
&&&&&&&&string&gameDataFile&=&GetDataPath()&+&"/"+dataFileN&
&&&&&&&&string&dataString=&xs.SerializeObject(gameData,typeof(GameData));&
&&&&&&&&xs.CreateXML(gameDataFile,dataString);&
&&&&//读档时调用的函数//&
&&&&public&&void&Load()&
&&&&&&&&string&gameDataFile&=&GetDataPath()&+&"/"+dataFileN&
&&&&&&&&if(xs.hasFile(gameDataFile))&
&&&&&&&&{&
&&&&&&&&&&&&string&dataString&=&xs.LoadXML(gameDataFile);&
&&&&&&&&&&&&GameData&gameDataFromXML&=&xs.DeserializeObject(dataString,typeof(GameData))&as&GameD&
&&&&&&&&&&&&//是合法存档//&
&&&&&&&&&&&&if(gameDataFromXML.key&==&gameData.key)&
&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&gameData&=&gameDataFromXML;&
&&&&&&&&&&&&}&
&&&&&&&&&&&&//是非法拷贝存档//&
&&&&&&&&&&&&else&
&&&&&&&&&&&&{&
&&&&&&&&&&&&&&&&//留空:游戏启动后数据清零,存档后作弊档被自动覆盖//&
&&&&&&&&&&&&}&
&&&&&&&&}&
&&&&&&&&else&
&&&&&&&&{&
&&&&&&&&&&&&if(gameData&!=&null)&
&&&&&&&&&&&&&&&&Save();&
&&&&&&&&}&
&&&&//获取路径//&
&&&&private&static&string&GetDataPath()&
&&&&&&&&//&Your&game&has&read+write&access&to&/var/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/Documents&
&&&&&&&&//&Application.dataPath&returns&ar/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/myappname.app/Data&&&&&&&&&&&&&&
&&&&&&&&//&Strip&"/Data"&from&path&
&&&&&&&&if(Application.platform&==&RuntimePlatform.IPhonePlayer)&
&&&&&&&&{&
&&&&&&&&&&&&string&path&=&Application.dataPath.Substring&(0,&Application.dataPath.Length&-&5);&
&&&&&&&&&&&&//&Strip&application&name&
&&&&&&&&&&&&path&=&path.Substring(0,&path.LastIndexOf('/'));&&
&&&&&&&&&&&&return&path&+&"/Documents";&
&&&&&&&&}&
&&&&&&&&else&
&&&&&&&&&&&&//&&&&return&Application.dataPath&+&"/Resources";&
&&&&&&&&&&&&return&Application.dataP&
这是XmlSaver类,用于管理XML。创建就可以,不需要操作。
using&UnityE&
using&System.C&
using&System.X&
using&System.Xml.S&
using&System.IO;&
using&System.T&
using&System.Security.C&
public&class&XmlSaver&:MonoBehaviour{&&&&
&&&&//内容加密&
&&&&public&string&Encrypt(string&toE)&
&&&&&&&&//加密和解密采用相同的key,具体自己填,但是必须为32位//&
&&&&&&&&byte[]&keyArray&=&UTF8Encoding.UTF8.GetBytes("");&
&&&&&&&&RijndaelManaged&rDel&=&new&RijndaelManaged();&
&&&&&&&&rDel.Key&=&keyA&
&&&&&&&&rDel.Mode&=&CipherMode.ECB;&
&&&&&&&&rDel.Padding&=&PaddingMode.PKCS7;&
&&&&&&&&ICryptoTransform&cTransform&=&rDel.CreateEncryptor();&
&&&&&&&&byte[]&toEncryptArray&=&UTF8Encoding.UTF8.GetBytes(toE);&
&&&&&&&&byte[]&resultArray&=&cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);&
&&&&&&&&return&Convert.ToBase64String(resultArray,0,resultArray.Length);&
&&&&//内容解密&
&&&&public&string&Decrypt(string&toD)&
&&&&&&&&//加密和解密采用相同的key,具体值自己填,但是必须为32位//&
&&&&&&&&byte[]&keyArray&=&UTF8Encoding.UTF8.GetBytes("");&
&&&&&&&&RijndaelManaged&rDel&=&new&RijndaelManaged();&
&&&&&&&&rDel.Key&=&keyA&
&&&&&&&&rDel.Mode&=&CipherMode.ECB;&
&&&&&&&&rDel.Padding&=&PaddingMode.PKCS7;&
&&&&&&&&ICryptoTransform&cTransform&=&rDel.CreateDecryptor();&
&&&&&&&&byte[]&toEncryptArray&=&Convert.FromBase64String(toD);&
&&&&&&&&byte[]&resultArray&=&cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);&
&&&&&&&&return&UTF8Encoding.UTF8.GetString(resultArray);&
&&&&public&string&SerializeObject(object&pObject,System.Type&ty)&
&&&&&&&&string&XmlizedString&&&=&&
&&&&&&&&MemoryStream&memoryStream&&=&new&MemoryStream();&
&&&&&&&&XmlSerializer&xs&&=&new&XmlSerializer(ty);&
&&&&&&&&XmlTextWriter&xmlTextWriter&&=&new&XmlTextWriter(memoryStream,&Encoding.UTF8);&
&&&&&&&&xs.Serialize(xmlTextWriter,&pObject);&
&&&&&&&&memoryStream&=&(MemoryStream)xmlTextWriter.BaseS&
&&&&&&&&XmlizedString&=&UTF8ByteArrayToString(memoryStream.ToArray());&
&&&&&&&&return&XmlizedS&
&&&&public&object&DeserializeObject(string&pXmlizedString&,&System.Type&ty)&
&&&&&&&&XmlSerializer&xs&&=&new&XmlSerializer(ty);&
&&&&&&&&MemoryStream&memoryStream&&=&new&MemoryStream(StringToUTF8ByteArray(pXmlizedString));&
&&&&&&&&XmlTextWriter&xmlTextWriter&&&=&new&XmlTextWriter(memoryStream,&Encoding.UTF8);&
&&&&&&&&return&xs.Deserialize(memoryStream);&
&&&&//创建XML文件&
&&&&public&void&CreateXML(string&fileName,string&thisData)&
&&&&&&&&string&xxx&=&Encrypt(thisData);&
&&&&&&&&StreamWriter&&
&&&&&&&&writer&=&File.CreateText(fileName);
&&&&&&&&writer.Write(xxx);&
&&&&&&&&writer.Close();&
&&&&//读取XML文件&
&&&&public&string&LoadXML(string&fileName)&
&&&&&&&&StreamReader&sReader&=&File.OpenText(fileName);&
&&&&&&&&string&dataString&=&sReader.ReadToEnd();&
&&&&&&&&sReader.Close();&
&&&&&&&&string&xxx&=&Decrypt(dataString);&
&&&&&&&&return&&
&&&&//判断是否存在文件&
&&&&public&bool&hasFile(String&fileName)&
&&&&&&&&return&File.Exists(fileName);&
&&&&public&string&UTF8ByteArrayToString(byte[]&characters&&)&
&&&&{&&&&&
&&&&&&&&UTF8Encoding&encoding&&=&new&UTF8Encoding();&
&&&&&&&&string&constructedString&&=&encoding.GetString(characters);&
&&&&&&&&return&(constructedString);&
&&&&public&byte[]&StringToUTF8ByteArray(String&pXmlString&)&
&&&&&&&&UTF8Encoding&encoding&&=&new&UTF8Encoding();&
&&&&&&&&byte[]&byteArray&&=&encoding.GetBytes(pXmlString);&
&&&&&&&&return&byteA&
这是场景里的存储内容
using&UnityE
using&System.C
[SerializeField]public&class&Sence{
&&&&//Cube的存储内容
&&&&public&Vector3&cubeP//正方形的坐标
场景里有一个Cube,两个4方形,两个4方形是为了方便对照Cube的位置。
调整摄像机角度,能看到Cube。
建一个空物体,用来加载GameDataManager(游戏日志控制器),和XmlSaver类。
给Cube写一个保存读取类(游戏日志控制器是对游戏数据的操作,所以只能改变部分数据,这个类用于改变Cube的部分数据)
using&UnityE
using&System.C
public&class&SaveCube&:&MonoBehaviour&{
&&&&public&void&Save(){//保存Cube的部分数据,这里保存Cube的位置信息
&&&&&&&&GameObject&cube&=&GameObject.Find("Cube");//获得Cube对象
&&&&&&&&GameObject&gameDataManager&=&GameObject.Find&("GameDataManager");//获得GameDataManager(游戏控制器)对象
&&&&&&&&GameDataManager&g&=&gameDataManager.GetComponent&GameDataManager&();//获得GameDataManager(游戏控制器)脚本
&&&&&&&&g.gameData.s.cubePosion&=&cube.transform.//保存Cube的位置
&&&&public&void&Load(){//场景开始时加载游戏对象
&&&&&&&&GameObject&cube&=&GameObject.Find("Cube");//获得Cube对象
&&&&&&&&GameObject&gameDataManager&=&GameObject.Find&("GameDataManager");//获得GameDataManager(游戏控制器)对象
&&&&&&&&GameDataManager&g&=&gameDataManager.GetComponent&GameDataManager&();//获得GameDataManager(游戏控制器)脚本
&&&&&&&&if(g.gameData.isDu&==&true){//如果是读档状态
&&&&&&&&&&&&cube.transform.position&=&g.gameData.s.cubeP//读取Cube的位置,并赋值给Cube
这是以场景为单位的(场景初始化,游戏日志保存)
using&UnityE
using&System.C
public&class&SenceData&:&MonoBehaviour&{
&&&&void&Start&()&{//初始化场景
&&&&&&&&//Cube信息的初始化
&&&&&&&&SaveCube&sc&=&gameObject.GetComponent&SaveCube&();
&&&&&&&&sc.Load&();
&&&&&&&&//末尾设置默认不读挡
&&&&&&&&GameObject&gameDataManager&=&GameObject.Find&("GameDataManager");
&&&&&&&&GameDataManager&g&=&gameDataManager.GetComponent&GameDataManager&&();
&&&&&&&&g.gameData.isDu&=&
&&&&&&&&g.Save&();
&&&&public&void&Save&(){//存档数据
&&&&&&&&//Cube信息的保存
&&&&&&&&SaveCube&sc&=&gameObject.GetComponent&SaveCube&();
&&&&&&& sc.Save();
建一个空物体用于加载SenceData类,SaveCube类,如图
这是选择读档 存档 默认场景的UI类(就是用于用户操作的按钮设置)
using&UnityE
using&System.C
public&class&UI&:&MonoBehaviour&{
&&&&private&GameDataManager&g;//定义GameDataManager(游戏控制器)脚本
&&&&private&SenceData&s;//定义SenceData(场景加载器)脚本
&&&&public&int&senceN
&&&&//&Use&this&for&initialization
&&&&void&Start&()&{
&&&&&&&&GameObject&gameDataManager&=&GameObject.Find&("GameDataManager");//获得GameDataManager(游戏控制器)对象
&&&&&&&&g&=&gameDataManager.GetComponent&GameDataManager&();//获得GameDataManager(游戏控制器)脚本
&&&&&&&&GameObject&senceData&=&GameObject.Find&("SenceData");//获得SenceData(场景加载器)对象
&&&&&&&&s&=&senceData.GetComponent&SenceData&();//获得SenceData(场景加载器)脚本
&&&&void&OnGUI(){
&&&&&&&&if(GUI.Button&(new&Rect(Screen.width/2-110,Screen.height/2-150,50,50),"存")){
&&&&&&&&&&&&s.Save&();//场景提交数据
&&&&&&&&&&&&g.Save&();//日志保存
&&&&&&&&if(GUI.Button&(new&Rect(Screen.width/2+110,Screen.height/2-150,50,50),"读")){
&&&&&&&&&&&&g.gameData.isDu&=&//设置为可读档状态
&&&&&&&&&&&&g.Save&();//日志保存为可读档状态
&&&&&&&&&&&&UnityEngine.SceneManagement.SceneManager.LoadScene&(senceNum);//加载场景
&&&&&&&&if(GUI.Button&(new&Rect(Screen.width/2-50,Screen.height/2-150,100,50),"默认场景")){
&&&&&&&&&&&&UnityEngine.SceneManagement.SceneManager.LoadScene&(senceNum);//加载场景
建一个空物体加载UI类,如图
这里我把SenceNum设置成0
保存场景,如图
然后File -&Build Settings..-&Add Open Sence,如图
这个存档的例子就做好了
运行时图为
保持运行,通过场景移动Cube,如图
回到游戏,点击存按钮,再点读。
获取了保存的位置,再点默认回到了原来的点。自己看看想想原理。程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之使用 C#合成解析XML与JSON(四十一)
Unity3D研究院之使用 C#合成解析XML与JSON(四十一)
围观57774次
编辑日期: 字体:
XML与JSON在开发中非常重要, 其实核心就是处理字符串。一个是XML的字符串一个是JSON的字符串,尤其是在处理网络请求的时候,肯定是要用的。另外现在JSON非常的流行,我写了一个简单的例子融合了XML与JSON的合成与解析,希望大家喜欢!
首先注意头文件,LitJson是处理JSON的第三方库,最后我会给出下载地址。
using UnityEngine;using System.Collections;using System.Collections.Generic;using System.Xml;using System.IO;using System.Text;using LitJson;
1、生成XML
1234567891011121314151617181920212223242526272829303132333435363738
public void createXml() {&&&&&&&&&&&&&& //xml保存的路径,这里放在Assets路径 注意路径。
string filepath = Application.dataPath + @"/my.xml";&&&&&&&&&&&&&& //继续判断当前路径下是否有该文件
if(!File.Exists (filepath))
{&&&&&&&&&&&&&&&&&&&&&&&& //创建XML文档实例
XmlDocument xmlDoc = new XmlDocument();&&&&&&&&&&&&&&&&&&&&&&&& //创建root节点,也就是最上一层节点
XmlElement root = xmlDoc.CreateElement("transforms");&&&&&&&&&&&&&&&&&&&&&&&&&&//继续创建下一层节点
XmlElement elmNew = xmlDoc.CreateElement("rotation");&&&&&&&&&&&&&&&&&&&&&&&&//设置节点的两个属性 ID 和 NAME
&&&& elmNew.SetAttribute("id","0");
&&&& elmNew.SetAttribute("name","momo");
&&&&&& //继续创建下一层节点&&&&&&&& &&&& XmlElement rotation_X = xmlDoc.CreateElement("x");&&&&&&&&&&&&&&&&&&&& //设置节点中的数值&&&&&&&&&&&&&&&&&&&& rotation_X.InnerText = "0";&&&&&&&&&&&&&&&&&&&&XmlElement rotation_Y = xmlDoc.CreateElement("y");&&&&&&&&&&&&&&&&&&&&rotation_Y.InnerText = "1";&&&&&&&&&&&&&&&&&&&&XmlElement rotation_Z = xmlDoc.CreateElement("z");&&&&&&&&&&&&&&&&&&&& rotation_Z.InnerText = "2";&&&&&&&&&&&&&&&&&&&&//这里在添加一个节点属性,用来区分。。&&
&& rotation_Z.SetAttribute("id","1");&&&&&&&&&&&&& //把节点一层一层的添加至XMLDoc中 ,请仔细看它们之间的先后顺序,这将是生成XML文件的顺序&&&&&&&&&&&& elmNew.AppendChild(rotation_X);&&&&&&&&&&&& elmNew.AppendChild(rotation_Y);&&&&&&&&&&&& elmNew.AppendChild(rotation_Z); &&&& root.AppendChild(elmNew);&&&&&&&&&&&& xmlDoc.AppendChild(root);&&&&&&&&&&&& //把XML文件保存至本地&&&&&&&&&&&& xmlDoc.Save(filepath);
Debug.Log("createXml OK!");
&transforms&&&&rotation id="0" name="momo"&&&&&&x&0&/x&&&&&&y&1&/y&&&&&&z id="1"&2&/z&&&&/rotation&&/transforms&
2.更新XML文件
以其中某个节点名称做条件,当查询到时更新该节点
123456789101112131415161718192021222324252627282930313233343536
public void UpdateXml() {
string filepath = Application.dataPath + @"/my.xml";
if(File.Exists (filepath))
XmlDocument xmlDoc = new XmlDocument();&&&&&&&&&&&&&&&&&&&&&&&& //根据路径将XML读取出来
xmlDoc.Load(filepath);&&&&&&&&&&&&&&&&&&&&&&&& //得到transforms下的所有子节点
XmlNodeList nodeList=xmlDoc.SelectSingleNode("transforms").ChildNodes;&&&&&&&&&&&&&&&&&&&&&&&& //遍历所有子节点
foreach(XmlElement xe in nodeList)
{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//拿到节点中属性ID =0的节点
if(xe.GetAttribute("id")=="0")
{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//更新节点属性
xe.SetAttribute("id","1000");&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//继续遍历
foreach(XmlElement x1 in xe.ChildNodes)
if(x1.Name=="z")
{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//这里是修改节点名称对应的数值,而上面的拿到节点连带的属性。。。
x1.InnerText="update00000";
xmlDoc.Save(filepath);
Debug.Log("UpdateXml OK!");
&transforms&&&&rotation id="1000" name="momo"&&&&&&x&0&/x&&&&&&y&1&/y&&&&&&z id="1"&update00000&/z&&&&/rotation&&/transforms&
重复的地方我就不解释拉。
1234567891011121314151617181920212223242526272829
public void AddXml() {
string filepath = Application.dataPath + @"/my.xml";
if(File.Exists (filepath))
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filepath);
XmlNode root = xmlDoc.SelectSingleNode("transforms");
XmlElement elmNew = xmlDoc.CreateElement("rotation");
elmNew.SetAttribute("id","1");
&&&&elmNew.SetAttribute("name","yusong");&&&&&&&&&
XmlElement rotation_X = xmlDoc.CreateElement("x");&&&&&&&&&&&& rotation_X.InnerText = "0";
rotation_X.SetAttribute("id","1");&&&&&&&&&&&& XmlElement rotation_Y = xmlDoc.CreateElement("y");&&&&&&&&&&&& rotation_Y.InnerText = "1";&&&&&&&&&&&& XmlElement rotation_Z = xmlDoc.CreateElement("z");&&&&&&&&&&&& rotation_Z.InnerText = "2"; &&&&&&&&&&&&& elmNew.AppendChild(rotation_X);&&&&&&&&&&&& elmNew.AppendChild(rotation_Y);&&&&&&&&&&&& elmNew.AppendChild(rotation_Z);
root.AppendChild(elmNew);&&&&&&&&&&&& xmlDoc.AppendChild(root);&&&&&&&&&&&& xmlDoc.Save(filepath);
Debug.Log("AddXml OK!");
123456789101112
&transforms&&&&rotation id="1000" name="momo"&&&&&&x&0&/x&&&&&&y&1&/y&&&&&&z id="1"&update00000&/z&&&&/rotation&&&&rotation id="1" name="yusong"&&&&&&x id="1"&0&/x&&&&&&y&1&/y&&&&&&z&2&/z&&&&/rotation&&/transforms&
1234567891011121314151617181920212223242526272829
public void deleteXml() {
string filepath = Application.dataPath + @"/my.xml";
if(File.Exists (filepath))
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filepath);
XmlNodeList nodeList=xmlDoc.SelectSingleNode("transforms").ChildNodes;
foreach(XmlElement xe in nodeList)
if(xe.GetAttribute("id")=="1")
xe.RemoveAttribute("id");
foreach(XmlElement x1 in xe.ChildNodes)
if(x1.Name == "z")
x1.RemoveAll();&
xmlDoc.Save(filepath);
Debug.Log("deleteXml OK!");
1234567891011121314
&transforms&&&&rotation id="1000" name="momo"&&&&&&x&0&/x&&&&&&y&1&/y&&&&&&z&&&&&&/z&&&&/rotation&&&&rotation name="yusong"&&&&&&x id="1"&0&/x&&&&&&y&1&/y&&&&&&z&&&&&&/z&&&&/rotation&&/transforms&
4.解析与输出上面的XML
1234567891011121314151617181920212223242526
public void showXml() {
string filepath = Application.dataPath + @"/my.xml";
if(File.Exists (filepath))
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filepath);
XmlNodeList nodeList=xmlDoc.SelectSingleNode("transforms").ChildNodes;
//遍历每一个节点,拿节点的属性以及节点的内容
foreach(XmlElement xe in nodeList)
Debug.Log("Attribute :" + xe.GetAttribute("name"));
Debug.Log("NAME :" + xe.Name);
foreach(XmlElement x1 in xe.ChildNodes)
if(x1.Name == "y")
Debug.Log("VALUE :" + x1.InnerText);&
Debug.Log("all = " + xmlDoc.OuterXml);&
运行结果(点击图片最大化)
接着是处理JSON
5.解析JSON字符串显示字典键值
123456789101112131415161718192021222324252627282930313233343536
public void ResolveJson() {&&&&&&&&&&&&&&&& //定义的JSON字符串,注意JSON的格式
string str = @"&&&&&&&&&&&&{&&&&&&&&&&&&&&&&""Name""&&&& : ""yusong"",&&&&&&&&&&&&&&&&""Age""&&&&&&: 26,&&&&&&&&&&&&&&&&""Birthday"" : """",
""Thumbnail"":[
{&&&&&&&&&&
""Url"":&&&&"""",&&&&&&&&&&
""Height"": 256,&&&&&&&&&&
""Width"":&&""200""
{&&&&&&&&&&
""Url"":&&&&"""",&&&&&&&&&&
""Height"": 1024,&&&&&&&&&&
""Width"":&&""500""
]&&&&&&&&&&&&}";
//这里是解析,包括整形与字符串
JsonData jd = JsonMapper.ToObject(str);
Debug.Log("name = " + (string)jd["Name"]);
Debug.Log("Age = " + (int)jd["Age"]);
Debug.Log("Birthday = " + (string)jd["Birthday"]);
JsonData jdItems = jd["Thumbnail"]; &
for (int i = 0; i & jdItems.Count; i++)
Debug.Log("URL = " + jdItems[i]["Url"]);
Debug.Log("Height = " + (int)jdItems[i]["Height"]);&&&&&&&& Debug.Log("Width = " + jdItems[i]["Width"]);
6.合成JSON字符串,先合成 然后在输出。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546
public void MergerJson() {
StringBuilder sb = new StringBuilder ();&&&&&&&&JsonWriter writer = new JsonWriter (sb);&&&&&&&&&writer.WriteObjectStart ();&
writer.WritePropertyName ("Name");&&&&&&&&writer.Write ("yusong");&
writer.WritePropertyName ("Age");&&&&&&&&writer.Write (26);&
writer.WritePropertyName ("Girl");&
writer.WriteArrayStart ();&
writer.WriteObjectStart();
writer.WritePropertyName("name");&&&&&&&&writer.Write("ruoruo");&&&&&&&&writer.WritePropertyName("age");&&&&&&&&writer.Write(24);
writer.WriteObjectEnd ();&
writer.WriteObjectStart();
writer.WritePropertyName("name");&&&&&&&&writer.Write("momo");&&&&&&&&writer.WritePropertyName("age");&&&&&&&&writer.Write(26);
writer.WriteObjectEnd ();&
writer.WriteArrayEnd();&
writer.WriteObjectEnd ();
Debug.Log(sb.ToString ());&
JsonData jd = JsonMapper.ToObject(sb.ToString ());
Debug.Log("name = " + (string)jd["Name"]);
Debug.Log("Age = " + (int)jd["Age"]);
JsonData jdItems = jd["Girl"];
for (int i = 0; i & jdItems.Count; i++)
Debug.Log("Girl name = " + jdItems[i]["name"]);
Debug.Log("Girl age = " + (int)jdItems[i]["age"]);
工程下载:
雨松MOMO祝大家学习愉快,哈哈哈。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!

我要回帖

更多关于 unity link.xml 的文章

 

随机推荐