在unity开发中多外接设备同时读值问题,现在在unity中开发一个开unity飞机大战源码的

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
【试读】《unity 5.x游戏开发指南》.pdf25页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:200 &&
【试读】《unity 5.x游戏开发指南》
你可能关注的文档:
··········
··········
Unity 图 下载页面 2-19 2-20 2-21 图 移动工具 图
 旋转工具 图
 缩放工具 图2-22 透视观察摄像机 图2-23 正交观察摄像机 2-33 3-5 图 高亮显示的预制体 图  脚本图标选择 4-4
3D 图   人物 4-10 4-13 图 材质球 图
 人物模型所使用的骨骼示意图 6-27
Layer Mask 8-3 12-3 图 图  烟花的效果 图
 点光源的效果 12-5 12-7 图 聚光源的效果 图
 方向光的效果 15-3 图
 烘焙后的场景 15-6
Areas 15-8
Nav Mesh Obstacle 图 标签页 图 17-5 17-6 Colorful 17-7
Colorful 图 效果 图
 使用 贴图的效果 图 贴图 图17-10 镜头光晕效果 图17-11 光晕效果 20-3 图
 战斗界面 内
要 本书详细介绍了Unity 5.0 的各个主要系统 包括地形系统 脚本系统 动画系统 界面系统 音频系统 , 、 、 、 、 、
网络通信系统和2D 系统 并通过大量案例讲解了Unity 5.0 的各种新特性 通俗易懂 是新手入门 迅速 , , , 、
上手的实用教程。 本书适用于Unity 初学者 移动游戏开发人员 虚拟现实开发人员 计算机及软件工程专业的学生以 、 、 、
及对Unity 开发感兴趣的读者 非常适合作为培训教材 , 。 ◆ 著    罗盛誉 责任编辑 王军花 策划编辑 张 霞 责任印制 杨林杰 ◆ 人民邮电出版社出版发行  北京市丰台区成寿寺路11号
网址 .cn 北京 印刷 ◆ 开本:800 × 印张:22 彩插:2 字数:520千字 2015年9 月第 1 版 印数:1 ― 4 000册 2015年9 月北京第 1 次印刷 定价:69.00元 读者服务热线: 010 座机电话号码转600 印装质量热线: 010 座机电话号码 反盗版热线: 010 座机电话号码 广告经营许可证:京崇工商广字第 0021 号 前
言 2 3 Unity 是一款非常强大的跨平台游
正在加载中,请稍后...6661人阅读
[Unity引擎](86)
[游戏开发](79)
喜欢我的博客请记住我的名字:秦元培,我的博客地址是:
转载请注明出处,本文作者:秦元培, 本文出处:
大家好,我是秦元培,欢迎大家关注我的博客。近期博客的更新频率基本直降到冰点,因为这段时间实在是忙得没有时间来写博客了。今天想和大家分享的内容是RPG游戏中游戏存档的实现,因为最近在做一个RPG游戏的项目,所以遇到这个问题就随时记录下来,在对知识进行总结的同时可以将这种思路或者想法分享给大家,这是一件快乐而幸运的事情。我讨厌写按部就班的技术教程,因为我觉得学习是一种自我的探索行为,如果一切都告诉你了,探索的过程便会变得没有意义了。
游戏存档是一种在单机游戏中特别常见的机制,这种机制是你在玩网络游戏的时候无法体验到的,你知道每次玩完一款单机游戏都会把游戏存档保存起来是一种怎样的感觉吗?它就像是一个征战沙场的将军将陪伴自己一生金戈铁马的宝剑静静地收入剑匣,然而每一次打开它的时候都会不由自主的热泪盈眶。人的本性其实就是游戏,我们每一天发生的故事何尝不是一个游戏?有时候让我们怀念的可能并不是游戏本身,而只是搁浅在时光里的那时的我们。好了,游戏存档是我们在游戏世界里雪泥鸿爪,它代表了我们曾经来到过这个世界。以RPG游戏为例,一个一般化的游戏存档应该囊括以下内容:
角色信息:指一切表征虚拟角色成长路线的信息,如生命值、魔法值、经验值等等。
道具信息:指一切表征虚拟道具数量或者作用的信息,如药品、道具、装备等等。
场景信息:指一切和游戏场景相关的信息,如场景名称、角色在当前场景中的位置坐标等等。
事件信息:指一切和游戏事件相关的信息,如主线任务、支线任务、触发性事件等等。
从以上信息划分的层次来看,我们可以发现在游戏存档中要储存的信息相对是比较复杂的,那么我们这里不得不说说Unity3D中的数据持久化方案PlayerPrefs。该方案采用的是一种键值型的数据存储方案,支持int、string、float三种基本数据类型,通过键名来获取相对应的数值,当值不存在时将返回一个默认值。这种数据存储方案本质上是将数据写入到一个Xml文件。这种方案如果用来存储简单的信息是没有问题的,可是如果用它来存储游戏存档这样负责的数据结构就显得力不从心了。一个更为重要的问题是在数据持久化的过程中我们希望得到是一个结构化的【游戏存档】实例,显然此时松散的PlayerPrefs是不能满足我们的要求的。因此我们想到了将游戏数据序列化的思路,常见的数据序列化思路主要有Xml和JSON两种形式,在使用Xml的数据序列化方案的时候通常有两种思路,即手动建立数据实体和数据字符间的对应关系和基于XmlSerializer的数据序列化。其中基于XmlSerializer的数据序列化是利用了[Serializable]这样的语法特性来帮助.NET完成数据实体和数据字符间的对应关系,两种思路本质上一样的。可是我们知道Xml的优点是可读性强,缺点是冗余信息多,因此在权衡了两种方案的利弊后,我决定采用JSON来作为数据序列化的方案,而且JSON在数据实体和数据字符间的对应关系上有着天然的优势,JSON所做的事情不就是将数据实体转化为字符串和从一个字符串中解析出数据实体吗?所以整个方案基本一气呵成。好了,下面我们来看具体的代码实现过程吧!
一、JSON的序列化和反序列化
这里我使用的是Newtonsoft.Json这个类库,相信大家都是知道的了!因此,序列化和反序列化特别简单。
将一个对象序列化为字符串
The object.
private static string SerializeObject(object pObject)
string serializedString = string.E
serializedString = JsonConvert.SerializeObject(pObject);
return serializedS
将一个字符串反序列化为对象
The object.
private static object DeserializeObject(string pString,Type pType)
object deserializedObject = null;
deserializedObject=JsonConvert.DeserializeObject(pString,pType);
return deserializedO
二、Rijandel加密/解密算法
因为我们这里要做的是一个游戏存档的方案设计,因为考虑到存档数据的安全性,我们可以考虑采用相关的加密/解密算法来实现对序列化后的明文数据进行加密,这样可以从一定程度上保证游戏存档数据的安全性。因为博主并没有深入地研究过加密/解密方面的内容,所以这里仅仅提供一个从MSDN上获取的Rijandel算法,大家感兴趣的话可以自行去研究。
Rijndael加密算法
待加密的明文
密钥,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])
iv向量,长度为128(byte[16])
private static string RijndaelEncrypt(string pString, string pKey)
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(pString);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyA
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
ijndael解密算法
待解密的密文
密钥,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])
iv向量,长度为128(byte[16])
private static String RijndaelDecrypt(string pString, string pKey)
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);
byte[] toEncryptArray = Convert.FromBase64String(pString);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyA
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
三、完整代码
好了,下面给出完整代码,我们这里提供了两个公开的方法GetData()和SetData()以及IO相关的辅助方法,我们在实际使用的时候只需要关注这些方法就可以了!
using UnityE
using System.C
using System.IO;
using System.T
using System.Security.C
using Newtonsoft.J
public static class IOHelper
判断文件是否存在
public static bool IsFileExists(string fileName)
return File.Exists(fileName);
判断文件夹是否存在
public static bool IsDirectoryExists(string fileName)
return Directory.Exists(fileName);
创建一个文本文件
public static void CreateFile(string fileName,string content)
StreamWriter streamWriter = File.CreateText(fileName);
streamWriter.Write(content);
streamWriter.Close();
创建一个文件夹
public static void CreateDirectory(string fileName)
if(IsDirectoryExists (fileName))
Directory.CreateDirectory(fileName);
public static void SetData(string fileName,object pObject)
string toSave = SerializeObject(pObject);
toSave = RijndaelEncrypt(toSave, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
StreamWriter streamWriter = File.CreateText(fileName);
streamWriter.Write(toSave);
streamWriter.Close();
public static object GetData(string fileName,Type pType)
StreamReader streamReader = File.OpenText(fileName);
string data = streamReader.ReadToEnd();
data = RijndaelDecrypt(data, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
streamReader.Close();
return DeserializeObject(data,pType);
Rijndael加密算法
待加密的明文
密钥,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])
iv向量,长度为128(byte[16])
private static string RijndaelEncrypt(string pString, string pKey)
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(pString);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyA
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
ijndael解密算法
待解密的密文
密钥,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])
iv向量,长度为128(byte[16])
private static String RijndaelDecrypt(string pString, string pKey)
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);
byte[] toEncryptArray = Convert.FromBase64String(pString);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyA
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
将一个对象序列化为字符串
The object.
private static string SerializeObject(object pObject)
string serializedString = string.E
serializedString = JsonConvert.SerializeObject(pObject);
return serializedS
将一个字符串反序列化为对象
The object.
private static object DeserializeObject(string pString,Type pType)
object deserializedObject = null;
deserializedObject=JsonConvert.DeserializeObject(pString,pType);
return deserializedO
这里我们的密钥是直接写在代码中的,这样做其实是有风险的,因为一旦我们的项目被反编译,我们这里的密钥就变得很不安全了。这里有两种方法,一种是把密钥暴露给外部方法,即在读取数据和写入数据的时候使用同一个密钥即可,而密钥可以采取由机器MAC值生成的方法,这样每台机器上的密钥都是不同的可以防止数据被破解;其次可以采用DLL混淆的方法让反编译者无法看到代码中的内容,这样就无法获得正确的密钥从而无法获得存档里的内容了。
四、最终效果
好了,最后我们来写一个简单的测试脚本:
using UnityE
using System.C
using System.Collections.G
public class TestSave : MonoBehaviour {
定义一个测试类
public class TestClass
public string Name = "张三";
public float Age = 23.0f;
public int Sex = 1;
public List&int& Ints = new List&int& ()
void Start ()
string dirpath = Application.persistentDataPath + "/Save";
IOHelper.CreateDirectory (dirpath);
string filename = dirpath + "/GameData.sav";
TestClass t = new TestClass ();
IOHelper.SetData (filename,t);
TestClass t1 = (TestClass)IOHelper.GetData(filename,typeof(TestClass));
Debug.Log(t1.Name);
Debug.Log(t1.Age);
Debug.Log(t1.Ints);
脚本执行结果:
加密后游戏存档:
好了,这就是今天的内容了,希望大家能够喜欢,有什么问题可以给我留言,谢谢!
感谢风宇冲一文提供相关思路!
喜欢我的博客请记住我的名字:秦元培,我的博客地址是:
转载请注明出处,本文作者:秦元培, 本文出处:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:872712次
积分:11057
积分:11057
排名:第1081名
原创:185篇
评论:1133条
秦元培,程序员、游戏开发者
如果觉得我的我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
(2)(5)(1)(4)(2)(5)(4)(1)(5)(4)(2)(1)(5)(4)(1)(7)(13)(1)(2)(1)(9)(8)(2)(5)(9)(23)(8)(13)(18)(7)(1)(1)(2)(1)(1)(1)(2)(1)(3)(1)更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
把视频贴到Blog或BBS
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
收藏成功,可进入查看所有收藏列表
方式1:用手机看
用爱奇艺APP或微信扫一扫,在手机上继续观看:
小飞机游戏视频-UNITY软件外包、UNITY3D软件开发UNITY3D游戏开发
方式2:一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:&&
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:&&
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
爸爸去哪儿2游戏 立即参与
小飞机游戏视频-UNITY软件外包、UNITY3D软件开发UNITY3D游戏开发
播放量数据:
你可能还想订阅他们:
{{#needAdBadge}} 广告{{/needAdBadge}}
&正在加载...
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制}

我要回帖

更多关于 ios外接设备开发 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信