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

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
关注:1882
当前位置: &
__________________________________________________________________________________
开发者干货区版块规则:
  1、文章必须是图文形式。(至少2幅图)
& && &2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
& && &3、本版块只支持在游戏蛮牛原创首发,不支持转载。
& && &4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
& && &5、......
__________________________________________________________________________________
查看: 6354|回复: 196
Unity上使用Linq To XML续篇为你的XML加密以及解密操作
本帖为抢楼帖,欢迎抢楼!&
9排名<font color="#FF昨日变化主题帖子积分
蛮牛币2717
在线时间1283 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 zhang 于
19:04 编辑
文字依然不会很长,内容绝对的受用
对于为什么要对xml加密,众所周知的对于一些客户端的游戏或者是单机游戏,xml存档如果不做特殊处理(加密和隐藏)那么玩家自己是可以打开并且修改的。玩过红色警戒的童鞋都知道,可以通过修改参数可以让自己无敌。玩游戏的时候这样固然很爽,但是对于我们开发的游戏可不希望杯别人随意修改参数,那么加密就显得至关重要啦。
核心的代码如下:
游客,如果您要查看本帖隐藏内容请
代码同样是包含了基本的增删改查四个基本操作,但是对于每一个操作都是有加密和解密处理,代码并没有做优化,反复的加密和解密是个不足之处。
测试如下:
简单的建立一个场景Text,可以只有一个主摄像机就行。在建立一个Text脚本,托给摄像机,text的代码如下:
[C#] 纯文本查看 复制代码using UnityE
using System.C
using System.Collections.G
using System.L
using System.Xml.L
using System.Security.C
using System.T
using System.IO;
using System.Security.AccessC
using System.Security.P
using System.Security.AccessC
using System.X
using System.Xml.S
public class LinqToXMLAndEncrypt
static string dataKey = SystemInfo.deviceUniqueI//设置秘钥,根据平台而定
//static string xmlpath = Application.persistentDataPath + @&\myXML&;//平台相关的路径(移动端)
static string xmlpath = Application.dataPath + @&\myXML&;//电脑上的路径,移动端没有这个访问权限
/// &summary&
/// 初始化一个XML文件
/// &/summary&
public static void CreateXMLDocument()
XElement root = new XElement(&XMLContent&,
new XElement(&IsFirstPlayGame&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Herb1&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Herb2&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Herb3&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Level01&, new XAttribute(&MyVaule&, &0&)),/*从level01到LevelDemo是用来表示这个关卡是否玩过,其中MyVaule=1表示玩过,0表示没有*/
new XElement(&Level02&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Level03&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Level04&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Level05&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Level06&, new XAttribute(&MyVaule&, &0&)),
new XElement(&LevelDemo&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Level&, new XAttribute(&MyVaule&, &0&)),
new XElement(&Root&, &root&)
root.Save(xmlpath);
EncrtyptSaveXML();
private static void
EncrtyptSaveXML()
StreamReader sReader = File.OpenText(xmlpath);
string xmlData = sReader.ReadToEnd();
sReader.Close();
string xxx = Encrypt(xmlData);
writer = File.CreateText(xmlpath);
writer.Write(xxx);
writer.Close();
public static XElement DecrtyptLoadXML()
if (hasFile(xmlpath))
StreamReader sReader = File.OpenText(xmlpath);
string xmlData = sReader.ReadToEnd();
sReader.Close();
string xxx = Decrypt(xmlData);
writer = File.CreateText(xmlpath);
writer.Write(xxx);
writer.Close();
XElement root = XElement.Load(xmlpath);
public static void SetElementValue(string name, string value)
XElement root = DecrtyptLoadXML();
root.Element(name).SetAttributeValue(&MyVaule&, value);
root.Save(xmlpath);
EncrtyptSaveXML();
/// &summary&
/// 在根节点元素之前添加新的元素
/// &/summary&
/// &param name=&name&&元素名字&/param&
/// &param name=&value&&元素的值&/param&
public static void AddElement(string name, string value)
XElement root = DecrtyptLoadXML();
root.Element(&Root&).AddBeforeSelf(new XElement(name, new XAttribute(&MyValue&, value)));
root.Save(xmlpath);
EncrtyptSaveXML();
/// &summary&
/// 删除指定的元素
/// &/summary&
/// &param name=&name&&要删除的元素名称&/param&
public static void RemoveElement(string name)
XElement root = DecrtyptLoadXML();
root.Element(name).Remove();
root.Save(xmlpath);
EncrtyptSaveXML();
/// &summary&
/// 根据元素名查找元素对应的值
/// &/summary&
/// &param name=&name&&元素名&/param&
/// &returns&&/returns&
public static string GetElementValue(string name)
XElement root = DecrtyptLoadXML();
XAttribute xattr = root.Element(name).Attribute(&MyVaule&);
string s = xattr.V
EncrtyptSaveXML();
/// &summary&
/// 内容加密,加密和解密采用相同的key,具体可以自己定义,条件是必须是32位的
/// &/summary&
/// &param name=&toE&&&/param&
/// &returns&&/returns&
private static
string Encrypt(string toE)
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);
/// &summary&
/// 内容解密,千万记住解密和加密采用相同的key,必须是32位
/// &/summary&
/// &param name=&toD&&&/param&
/// &returns&&/returns&
private static
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);
/// &summary&
/// 判断XML文档是否存在
/// &/summary&
/// &param name=&fileName&&&/param&
/// &returns&&/returns&
public static bool hasFile(string fileName)
return File.Exists(fileName);
/// &summary&
/// 读取XML,返回XML的字符串
/// &/summary&
/// &returns&返回XML的一串字符&/returns&
public static
string LoadXMLForString(bool isDecrypt=true)
if (hasFile(xmlpath))
StreamReader sReader = File.OpenText(xmlpath);
string dataString = sReader.ReadToEnd();
sReader.Close();
if (isDecrypt)
string xxx = Decrypt(dataString);
else return dataS
(注意一个,新增加的元素在一个方法里面是不会立马读出来的,因为XML的操作都是延迟执行的。比如说上面的代码
GUIDebug.Log(&ssssss:&+ LinqToXMLAndEncrypt.GetElementValue(&Herb1&));处换成GUIDebug.Log(&ssssss:&+ LinqToXMLAndEncrypt.GetElementValue(&ZHangXiaob&));就会报错)
核心代码中的 public static&&string LoadXMLForString(bool isDecrypt=true)方法是为了方便测试用的,它可以将整个XML读出成为一串字符串
我定义一个参数bool isDecrypt=true,为true的时候读出来的是解密的也就是正常的,为false的时候读出来是加密的
QQ截图40.png (143.48 KB, 下载次数: 3)
18:46 上传
QQ截图40.png (164.17 KB, 下载次数: 3)
18:46 上传
来看看直接打开XML是什么样的
QQ截图00.png (90.38 KB, 下载次数: 4)
18:48 上传
,怎么样,这样就不用再担心玩家破解了我们做的游戏了。
喜欢的同学点个赞吧,有错的地方欢迎留言!
unity xml存档;unity。 xml 存档
每日推荐:
5563/1000排名<font color="#FF昨日变化6主题帖子积分
熟悉之中, 积分 563, 距离下一级还需 437 积分
熟悉之中, 积分 563, 距离下一级还需 437 积分
蛮牛币1474
在线时间125 小时
谢谢楼主,好人一生平安
每日推荐:
126/50排名<font color="#FF昨日变化21主题帖子积分
注册看看, 积分 26, 距离下一级还需 24 积分
注册看看, 积分 26, 距离下一级还需 24 积分
在线时间4 小时
想破解你 这点加密有什么用. Assembly-CSharp.dll一反编译就行了
每日推荐:
4475/500排名<font color="#FF昨日变化5主题帖子积分
四处流浪, 积分 475, 距离下一级还需 25 积分
四处流浪, 积分 475, 距离下一级还需 25 积分
在线时间271 小时
想破解你 这点加密有什么用. Assembly-CSharp.dll一反编译就行了
那就混淆一下呗,这样的话像破解的话就更困难一点
每日推荐:
9排名<font color="#FF昨日变化主题帖子积分
蛮牛币2717
在线时间1283 小时
想破解你 这点加密有什么用. Assembly-CSharp.dll一反编译就行了
道高一尺魔高一丈,连Unity和Windows都可以破解何况我这个。我的文章开头就声明了,是为了那些玩你做的游戏的普通玩家通过修该XML来修改游戏参数尤其是在用XML作为本地主要存档的时候,我相信不是所有的普通玩家都和你这个大牛一样会使用这个来破解吧!
每日推荐:
7排名36昨日变化1主题帖子积分
蛮牛币18811
在线时间955 小时
非常感谢楼主提供的方法,还是比较详细的,试问哪个程序能绝对不被破解,相对提高安全系数总是没错的。
每日推荐:
用心强于用脑,真诚胜过技巧。
9排名<font color="#FF昨日变化主题帖子积分
蛮牛币2717
在线时间1283 小时
非常感谢楼主提供的方法,还是比较详细的,试问哪个程序能绝对不被破解,相对提高安全系数总是没错的。{:90 ...
谢谢版主的支持与肯定!
每日推荐:
73073/5000排名<font color="#FF昨日变化主题帖子积分
日久生情, 积分 3073, 距离下一级还需 1927 积分
日久生情, 积分 3073, 距离下一级还需 1927 积分
蛮牛币8081
在线时间732 小时
感谢分享,好人一生平安
每日推荐:
9排名<font color="#FF昨日变化主题帖子积分
在线时间514 小时
!!!!!!!!!!
每日推荐:
3224/300排名<font color="#FF昨日变化6主题帖子积分
偶尔光临, 积分 224, 距离下一级还需 76 积分
偶尔光临, 积分 224, 距离下一级还需 76 积分
在线时间27 小时
谢谢楼主如此信息的讲解, 受益匪浅啊。 谢谢楼主。 感谢楼主
每日推荐:
61164/1500排名<font color="#FF昨日变化1主题帖子积分
蛮牛粉丝, 积分 1164, 距离下一级还需 336 积分
蛮牛粉丝, 积分 1164, 距离下一级还需 336 积分
蛮牛币1810
在线时间328 小时
好人一生平安····································
每日推荐:
72850/5000排名68昨日变化主题帖子积分
日久生情, 积分 2850, 距离下一级还需 2150 积分
日久生情, 积分 2850, 距离下一级还需 2150 积分
蛮牛币5866
在线时间585 小时
很不错,学习了,多谢分享!!1
每日推荐:
2127/150排名<font color="#FF昨日变化12主题帖子积分
初来乍到, 积分 127, 距离下一级还需 23 积分
初来乍到, 积分 127, 距离下一级还需 23 积分
在线时间24 小时
Linq To XML续篇为你的XML加密以及解密操作
每日推荐:
71563/5000排名<font color="#FF昨日变化3主题帖子积分
日久生情, 积分 1563, 距离下一级还需 3437 积分
日久生情, 积分 1563, 距离下一级还需 3437 积分
蛮牛币3078
在线时间498 小时
好东西,顶起。。。。。。。
每日推荐:
4321/500排名<font color="#FF昨日变化8主题帖子积分
四处流浪, 积分 321, 距离下一级还需 179 积分
四处流浪, 积分 321, 距离下一级还需 179 积分
在线时间138 小时
?????????????????????????????
每日推荐:
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号
社区QQ达人
使用QQ帐号登录论坛的用户
连续签到30天
游戏蛮牛QQ群会员
加入游戏蛮牛官方QQ群
在“新人报到 ”版块发过自己的照片
认证开发者
经过游戏蛮牛认证的独立开发者尊重原创,转载请注明出处,谢谢!
之前已经简单介绍了XML和JSON的基本使用方法。这里我就介绍一个例子来对XML和JSON进行实战应用 --------- 场景的保存和热更。
提前Ps : & 所讲工程内容最后都会给出源码地址。
1.首先你得有一个场景。这个迷宫地形我搭了好久。。
可以看到地图中有个环境Env,人物Player,灯光Light,UGUI事件系统EventSystem,画布Canvas。Init不用管,先删掉。我们把这几个物品全部做成Prefab。我放在了Prefab的文件夹里面。
&#20540;得注意的是,如果这些Prefab或者其子物体中身上所挂脚本有pubulic变量添加的是其他物体或者组件的引用需要将这些变量全部私有化然后放到Awake函数里面通过Game.FindWithTag()或者Transform.Find等函数动态获取。
当然,以上的解决方案可能让你很不习惯,没有更好的解决方法了吗?当然有,这个教程中我们只是对资源设置了Prefab。后面我们用篇文章来讲述AssetBundle的使用,而这个技术不仅实现了资源的打包,而且很好的处理了这些资源依赖关系。这也就是后话了。。。这篇文章不涉及。
2.做完以上步骤之后,我们对资源的处理就完毕了,剩下我们就来编写代码实现对场景信息记录。大概的思路就是:读取所有场景信息,然后对于每个场景遍历其所有的Prefab物体,然后记录其坐标,旋转,大小。( 注意:下面代码中涉及到LitJsond包的使用,请将LitJson.dll放到工程的Plugin目录下
using UnityE
using System.C
using UnityE
using System.Collections.G
using System.X
using System.IO;
using System.T
using LitJ
public class ScencePack : Editor
//将所有游戏场景导出为XML格式
[MenuItem(&GameObject/ExportXML&)]
static void ExportXML()
string filepath = Application.dataPath + @&/StreamingAssets/my.xml&;
if (!File.Exists(filepath))
File.Delete(filepath);
XmlDocument xmlDoc = new XmlDocument();
XmlElement root = xmlDoc.CreateElement(&gameObjects&);
//遍历所有的游戏场景
foreach (UnityEditor.EditorBuildSettingsScene S in UnityEditor.EditorBuildSettings.scenes)
//当关卡启用
if (S.enabled)
//得到关卡的名称
string name = S.
//打开这个关卡
EditorApplication.OpenScene(name);
XmlElement scenes = xmlDoc.CreateElement(&scenes&);
scenes.SetAttribute(&name&, name);
foreach (GameObject obj in Object.FindObjectsOfType(typeof(GameObject)))
if (obj.transform.parent == null)
XmlElement gameObject = xmlDoc.CreateElement(&gameObjects&);
gameObject.SetAttribute(&name&, obj.name);
gameObject.SetAttribute(&asset&, obj.name + &.prefab&);
XmlElement transform = xmlDoc.CreateElement(&transform&);
XmlElement position = xmlDoc.CreateElement(&position&);
XmlElement position_x = xmlDoc.CreateElement(&x&);
position_x.InnerText = obj.transform.position.x + &&;
XmlElement position_y = xmlDoc.CreateElement(&y&);
position_y.InnerText = obj.transform.position.y + &&;
XmlElement position_z = xmlDoc.CreateElement(&z&);
position_z.InnerText = obj.transform.position.z + &&;
position.AppendChild(position_x);
position.AppendChild(position_y);
position.AppendChild(position_z);
XmlElement rotation = xmlDoc.CreateElement(&rotation&);
XmlElement rotation_x = xmlDoc.CreateElement(&x&);
rotation_x.InnerText = obj.transform.rotation.eulerAngles.x + &&;
XmlElement rotation_y = xmlDoc.CreateElement(&y&);
rotation_y.InnerText = obj.transform.rotation.eulerAngles.y + &&;
XmlElement rotation_z = xmlDoc.CreateElement(&z&);
rotation_z.InnerText = obj.transform.rotation.eulerAngles.z + &&;
rotation.AppendChild(rotation_x);
rotation.AppendChild(rotation_y);
rotation.AppendChild(rotation_z);
XmlElement scale = xmlDoc.CreateElement(&scale&);
XmlElement scale_x = xmlDoc.CreateElement(&x&);
scale_x.InnerText = obj.transform.localScale.x + &&;
XmlElement scale_y = xmlDoc.CreateElement(&y&);
scale_y.InnerText = obj.transform.localScale.y + &&;
XmlElement scale_z = xmlDoc.CreateElement(&z&);
scale_z.InnerText = obj.transform.localScale.z + &&;
scale.AppendChild(scale_x);
scale.AppendChild(scale_y);
scale.AppendChild(scale_z);
transform.AppendChild(position);
transform.AppendChild(rotation);
transform.AppendChild(scale);
gameObject.AppendChild(transform);
scenes.AppendChild(gameObject);
root.AppendChild(scenes);
xmlDoc.AppendChild(root);
xmlDoc.Save(filepath);
//刷新Project视图, 不然需要手动刷新哦
AssetDatabase.Refresh();
//将所有游戏场景导出为JSON格式
[MenuItem(&GameObject/ExportJSON&)]
static void ExportJSON()
string filepath = Application.dataPath + @&/StreamingAssets/json.txt&;
FileInfo t = new FileInfo(filepath);
if (!File.Exists(filepath))
File.Delete(filepath);
StreamWriter sw = t.CreateText();
StringBuilder sb = new StringBuilder();
JsonWriter writer = new JsonWriter(sb);
writer.WriteObjectStart();
writer.WritePropertyName(&GameObjects&);
writer.WriteArrayStart();
foreach (UnityEditor.EditorBuildSettingsScene S in UnityEditor.EditorBuildSettings.scenes)
if (S.enabled)
string name = S.
EditorApplication.OpenScene(name);
writer.WriteObjectStart();
writer.WritePropertyName(&scenes&);
writer.WriteArrayStart();
writer.WriteObjectStart();
writer.WritePropertyName(&name&);
writer.Write(name);
writer.WritePropertyName(&gameObject&);
writer.WriteArrayStart();
foreach (GameObject obj in Object.FindObjectsOfType(typeof(GameObject)))
if (obj.transform.parent == null)
writer.WriteObjectStart();
writer.WritePropertyName(&name&);
writer.Write(obj.name);
writer.WritePropertyName(&asset&);
writer.Write(obj.name + &.prefab&);
writer.WritePropertyName(&position&);
writer.WriteObjectStart();
writer.WritePropertyName(&x&);
writer.Write(obj.transform.position.x.ToString(&F5&));
writer.WritePropertyName(&y&);
writer.Write(obj.transform.position.y.ToString(&F5&));
writer.WritePropertyName(&z&);
writer.Write(obj.transform.position.z.ToString(&F5&));
writer.WriteObjectEnd();
writer.WritePropertyName(&rotation&);
writer.WriteObjectStart();
writer.WritePropertyName(&x&);
writer.Write(obj.transform.rotation.eulerAngles.x.ToString(&F5&));
writer.WritePropertyName(&y&);
writer.Write(obj.transform.rotation.eulerAngles.y.ToString(&F5&));
writer.WritePropertyName(&z&);
writer.Write(obj.transform.rotation.eulerAngles.z.ToString(&F5&));
writer.WriteObjectEnd();
writer.WritePropertyName(&scale&);
writer.WriteObjectStart();
writer.WritePropertyName(&x&);
writer.Write(obj.transform.localScale.x.ToString(&F5&));
writer.WritePropertyName(&y&);
writer.Write(obj.transform.localScale.y.ToString(&F5&));
writer.WritePropertyName(&z&);
writer.Write(obj.transform.localScale.z.ToString(&F5&));
writer.WriteObjectEnd();
writer.WriteObjectEnd();
writer.WriteArrayEnd();
writer.WriteObjectEnd();
writer.WriteArrayEnd();
writer.WriteObjectEnd();
writer.WriteArrayEnd();
writer.WriteObjectEnd();
sw.WriteLine(sb.ToString());
sw.Close();
sw.Dispose();
AssetDatabase.Refresh();
}( 申明: 以上代码源自雨松Momo大神,本人根据工程实际情况可能有地方进行了略微修改 )
创建好脚本保存后,你会发现在Unity工具栏上GameObject那栏下拉列表中会出现 ExportXML 和 ExportJSON。保存场景。
然后在工程中创建一个文件夹命名StreamingAssets。然后点击以上两个选项其一。然后就会在该目录中生成对应的记录文件。
我们可以打开这两个文件进行查看,记录的就是工程的所有场景信息和每个场景中物体的Transform信息。
3.加载场景。大概思路:我们就可以通过解析这些文件,然后得到自身场景的Prefab的Transform信息,然后根据asset路径信息去加载prefab然后实例到到场景中,再调整坐标,大小,旋转。即可复原原来的场景。
下面是加载场景的脚本:
using UnityE
using System.C
using System.X
using System.IO;
using UnityE
using LitJ
public class LoadScene: MonoBehaviour
[MenuItem(&GameObject/ImprotXML&)]
public static void LoadSenceXML()
//电脑和iphong上的路径是不一样的,这里用标签判断一下。
#if UNITY_EDITOR
string filepath = Application.dataPath + &/StreamingAssets& + &/my.xml&;
#elif UNITY_IPHONE
string filepath = Application.dataPath +&/Raw&+&/my.xml&;
//如果文件存在话开始解析。
if (File.Exists(filepath))
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filepath);
XmlNodeList nodeList = xmlDoc.SelectSingleNode(&gameObjects&).ChildN
foreach (XmlElement scene in nodeList)
//因为我的XML是把所有游戏对象全部导出, 所以这里判断一下只解析需要的场景中的游戏对象
//JSON和它的原理类似
string path = scene.GetAttribute(&name&);
string name = path.Substring(path.LastIndexOf(&#39;/&#39;)+1,path.LastIndexOf(&#39;.&#39;)-path.LastIndexOf(&#39;/&#39;)-1);
Debug.Log(name);
if (!name.Equals(Application.loadedLevelName))
foreach (XmlElement gameObjects in scene.ChildNodes)
string asset = &Assets/Prefab/& + gameObjects.GetAttribute(&asset&);
Vector3 pos = Vector3.
Vector3 rot = Vector3.
Vector3 sca = Vector3.
foreach (XmlElement transform in gameObjects.ChildNodes)
foreach (XmlElement prs in transform.ChildNodes)
if (prs.Name == &position&)
foreach (XmlElement position in prs.ChildNodes)
switch (position.Name)
pos.x = float.Parse(position.InnerText);
pos.y = float.Parse(position.InnerText);
pos.z = float.Parse(position.InnerText);
else if (prs.Name == &rotation&)
foreach (XmlElement rotation in prs.ChildNodes)
switch (rotation.Name)
rot.x = float.Parse(rotation.InnerText);
rot.y = float.Parse(rotation.InnerText);
rot.z = float.Parse(rotation.InnerText);
else if (prs.Name == &scale&)
foreach (XmlElement scale in prs.ChildNodes)
switch (scale.Name)
sca.x = float.Parse(scale.InnerText);
sca.y = float.Parse(scale.InnerText);
sca.z = float.Parse(scale.InnerText);
//拿到 旋转 缩放 平移 以后克隆新游戏对象
Debug.Log(asset);
Object obj = UnityEditor.AssetDatabase.LoadAssetAtPath(asset, typeof(GameObject));
GameObject ob = (GameObject)Instantiate(obj, pos, Quaternion.Euler(rot));
ob.transform.localScale =
ob.name = obj.
[MenuItem(&GameObject/ImprotJSON&)]
public static void LoadSenceJSON()
#if UNITY_EDITOR
string filepath = Application.dataPath + &/StreamingAssets& + &/json.txt&;
#elif UNITY_IPHONE
string filepath = Application.dataPath +&/Raw&+&/json.txt&;
StreamReader sr = File.OpenText(filepath);
string strLine = sr.ReadToEnd();
JsonData jd = JsonMapper.ToObject(strLine);
JsonData gameObjectArray = jd[&GameObjects&];
for (i = 0; i & gameObjectArray.C i++)
JsonData senseArray = gameObjectArray[i][&scenes&];
for (j = 0; j & senseArray.C j++)
string path = (string)senseArray[j][&name&];
string name = path.Substring(path.LastIndexOf(&#39;/&#39;) + 1, path.LastIndexOf(&#39;.&#39;) - path.LastIndexOf(&#39;/&#39;) - 1);
if (!name.Equals(Application.loadedLevelName))
JsonData gameObjects = senseArray[j][&gameObject&];
for (k = 0; k & gameObjects.C k++)
string asset = &Assets/Prefab/& + (string)gameObjects[k][&asset&];
Vector3 pos = Vector3.
Vector3 rot = Vector3.
Vector3 sca = Vector3.
JsonData position = gameObjects[k][&position&];
JsonData rotation = gameObjects[k][&rotation&];
JsonData scale = gameObjects[k][&scale&];
pos.x = float.Parse((string)position[&x&]);
pos.y = float.Parse((string)position[&y&]);
pos.z = float.Parse((string)position[&z&]);
rot.x = float.Parse((string)rotation[&x&]);
rot.y = float.Parse((string)rotation[&y&]);
rot.z = float.Parse((string)rotation[&z&]);
sca.x = float.Parse((string)scale[&x&]);
sca.y = float.Parse((string)scale[&y&]);
sca.z = float.Parse((string)scale[&z&]);
Debug.Log(asset);
Object obj = UnityEditor.AssetDatabase.LoadAssetAtPath(asset, typeof(GameObject));
GameObject ob = (GameObject)Instantiate(obj, pos, Quaternion.Euler(rot));
ob.transform.localScale =
ob.name = obj.
}我们发现现在GameObject工具栏又多了两个选项:ImportXML,ImportJSON。这就是导入场景信息。
有了以上代码我们就可以对场景的复原了。
首先:我们先把场景里面的物品全部删了。( 注意:要先通过ExportXML or ExportJSON 导出场景记录 )
然后:创建一个名为Init的空物体。挂上一个脚本TestData. 然后只留Start函数然后执行&LoadScene.LoadSenceJSON() 或者&LoadScene.LoadSenceXML();
最后:运行游戏。你会发现所有物体都被实例化出来了。
基本上xml和json的对场景保存和加载的方式如上。最后记录信息文件也不是特别大:
不过你觉得你的工程物品实在有点多,信息文件太大,影响效率的话。可以使用二进制数据&#26684;式。主要就是使用BinaryWriter写出二进制流,用BinaryRendeader读入二进制流。这样可以大大压缩信息文件的大小。不过这种方式的坏处是解析的时候。必须要完全了解写入信息的顺序。也就是说如果是xml和json的话只需要知道属性名就可以获取了。而二进制没有这些用于索引的字符,所以只能严&#26684;按照字节位数来控制每个变量的所占位置。同时也必须严&#26684;按照字节对齐。不然一个变量范围错了,后面的跟着都错了。
Demo工程地址:
本文已收录于以下专栏:
相关文章推荐
一、创建Assetbundle
在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新。
&#160; &#160; &#160; ...
最近在学热更新,涉及到资源热更,所以就了解了XML,JSON相关的东西。这方面网上资料还是比较多的,所以这里主要是总结一下基本使用方法和一些应用的Demo。
1.先介绍一下 XML 和 JSON ...
using UnityE
using System.C
using UnityE
public class ExportAssetBundles {
一.插件下载:
&#160;链接:/s/1pKiqqRx 密码:het2
二.使用教程:
&#160;&#160;&#160;&#160;&#160;&#160;首先导入插件,在写代码的时候先引入命名空间
using D...
之前我们介绍了老版本的AssetBundle,在文章最后我们提到了在生成AB包的时候同时生成依赖关系信息文件。这样加载的时候就能够自动加载所有依赖项。而新版的AssetBundle正是采用的这样的方式...
1.代码层面
Mono下的foreach使用需谨慎,频繁调用容易触及堆上限,导致GC过早触发,出现卡顿现象。
特别注意的是在Update中如果非必要,不要使用fo...
这篇文章已经是我写的XML和JSON应用系列的第三篇了,有了前面两篇的基础。这篇文章读起来应该不是很困难。当然如果你是直接看的这篇文章吃力的话可以先去看看前面两篇文章。 这篇文章主要讲述如何使用对游戏...
Unity StrangeIoC(一)
正式之前先说说基础的概念:
首先是MVC框架,MVC框架的思路是将业务逻辑、数据、界面显示分离,网上很多关于MVC的资料,这里不再过多的...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 unity3d xml 创建 的文章

 

随机推荐