项目开发笔记 (七)

很多APP中都会有个人信息,或者个人帐号 都会有设置头像功能,国内的很多APP更加是如此(很多人的帐号密码泄密,正是由于到处注册帐号,举个我当年密码泄漏的例子,在很多年的某一天 我在某个网吧的嘟嘟牛系统注册了一个帐号,当时毫无安全意识,直接用个人密码作为嘟嘟牛的密码,很多年后的今天 我在嘟嘟牛的用户数据库里找到了我当年的个人所有信息…嘟嘟牛的数据库怎么会流出来?A.黑客把嘟嘟牛黑掉,把数据库拿到地下交易市场卖,B.嘟嘟牛的某个数据库程序员离职 顺带把数据库带出来,C.公司倒闭,倒卖数据榨干最后一点价值等等..),言归正传,目前我在参与一个类APP项目的优化工作.使用Unity开发.也有这种..设置用户头像的需求

Unity Version: 5.x or 4.x

本文内容非纯干货,如果不想看可以直接下载Sample – 传送门

继续阅读

很多跨平台实现都避免不了需要加载一个so库,而so库针对不同的芯片还需要不同的编辑版本(ARM和X86).这间接得导致android APP包越来越大.例如目前cocos2d-x的6-8M,Unity5的16-18M,而这都是一张图片 一句具体代码都没写的情况下.做过游戏的都知道:

  1. 资源可以脱离APK包 采用在线更新的方式download到手机上.
  2. 脚本(Lua or Js or C#)也可以采用热更新的方式download到手机上.
  3. 甚至玩家安装了一次APK,以后的新版本APK都可以采用后台download静默安装的方式更新自身.

那现在就剩下最后两个问题:

  1. 我嫌弃更新APK麻烦,只想更新so库,那so库是否可以动态更新?
  2. 或者更变态一点,即使非常必要的时候,我依然不想更新APK,dex是否可以动态更新?

so库:android项目的C++原生拓展编译库,可被加载后执行.
dex文件:android项目中的java代码生成的可执行文件.

下面我们探讨下这第一个问题.

继续阅读

项目开发笔记 (六)

Unity中的网络组件难用得要死,于是我自己使用C#自带的socket封装后实现了一个,代码几乎没有用任何C#的高级特性。所以可读性上应该没任何难度的。这个代码本来是项目中不可对外的,不过现在也无所谓了。刚好之前在群里看到有很多朋友找现成的封装,这个就是了哟。

代码结构

简略说明

数据包头设计成6字节,压缩到最小了,其实可以4字节都OK,不过前面两个标识字节感觉还是有点用的,数据包结构如下:

0 1 2,3 4,5 6,buffLenght
8D 8H 数据包长度信息 消息id 具体消息数据

数据包长度只给了2字节,也就是 0~65535byte,我觉得数据包这个范围已经足够,消息ID也给了两个字节,也就是 ID号的范围为 0~65535 一般中型的网络游戏 不会多到有6W种不同的消息吧?

收发数据我使用了两个子线程去处理(也可以把收发数据全部放到一个子线程中)

剩下的和其他语言的网络封装没任何实际性的差别,大家看代码即懂

代码传送门:https://github.com/recter/Unity-Net

这个月给自己放了个假,去京城走了一遭,一周的时间内 我已经在京城暴走超过120公里了,虽然现在国内景点已经非常商业化了,京城的几个景点里的物件也只是复刻品而已,但是从小在教科书 电视剧 中看过那么多京城的地方 总觉得应该走上一走。这个年头在国内旅行绝对不要报团,路上看到很多报团的人无论到了每个景点 都像SB一样跟着导游跑 卡擦卡擦几张照片就算完了,其实很多景点还有很多很多的地方可以去。在我走遍了十几个景点之后 发现 每个景点 80%的旅客都只走20%的区域,剩下80%的地方无人问津,举个例子,这是我正午12点拍摄的天坛,大家都只走中间那条路 登上祈天殿,然后拍照走人。而周围的地方却人迹罕至。

继续阅读

射击游戏项目开发笔记 (五)

字符屏蔽似乎是在我朝才有的东西.这屏蔽那屏蔽的,干脆彻底把Internet变成Local Area Network得了(虽然现在对大部分人来说已经是Local Area Network了).如果说我有什么职业梦想的话,The Great Wall崩塌估计是我唯一的梦想了.

在目前国内游戏的字符屏蔽中,主要是分为:聊天屏蔽(过滤词语) 和 命名屏蔽(过滤词语+过滤特殊标点符号)

过滤词语

首先看以下趣图:

继续阅读

射击游戏项目开发笔记 (四)

项目可用目录说明:(android为例)

一般的android程序可读的目录有

  • 包本身的外部资源目录,资源不参与签名(APK的Assets文件夹下,实际位置 data/app/包ID.apk) 仅可读
  • 包本身的内部自由目录,资源参与签名(APK的res文件夹下) 仅可读
  • 系统分配的用户目录(实际位置一般是 data/data/包ID/files) 可读写
  • 手机存储 / SD卡内 可读写

资源加载规则

0.从包内文件中加载
1.资源加载模块直接提供从包内文件和从用户目录(或者SD卡某目录)两种加载路径
2.游戏第一次启动时,将包内文件全部copy到用户目录,或者SD卡目录,下载文件也下载到这个目录,然后统一在这个目录加载(这是我之前的项目的方式,现在看来是有问题的)

继续阅读

射击游戏项目开发笔记 (三)

定时器是游戏中必备的支持之一,而且也属于代码运行频率比较高的部分.所以一个设计精良的定时器绝对是地基里的一块好砖头.

在Unity中有很多种方式可以使用定时器.

Update中计算时间

最简单的可能就是在Update中获取deltaTime,然后累计时间触发了,如果要隔一秒调用某个函数,使用Update代码类似如下

private float m_fTimeTotal = 0.0f;
void Update () 
{
    m_fTimeTotal += Time.deltaTime;
    if (m_fTimeTotal > 1000f)
    {
        m_fTimeTotal = 0.0f;
        // do something
    }
}

继续阅读

射击游戏项目开发笔记 (二)

由于很多的因素,项目改用U3D开发,而项目组目前为止没资深的Unity开发程序员,只能摸着石头过河了.我们网络通信数据使用protobuf的格式,(关于这protobuf的格式分析在上一篇笔记中已经分析得很详细了).简单说明一下目前项目的开发环境与插件的使用情况:

开发脚本: C# (.Net 2.0) 由于我与另一位同事均无C#功底,所以业余时间学习C#必不可少,本人而言已经有了基本的计划.(为什么不是JS 或者BOO,详细翻了一下Assets Unity 基本上大多插件都是用C#写的,Boo更加是第一次听)

开发工具:抛弃官方的Mono 使用VS2012,主要使用了UnityVS插件,注意这个插件现在已经免费了.传送门

GUI:有UGUI与NGUI和GUI三个选择,目前选的是NGUI,主要原因是NGUI的教材网上一抓一大把,由于换引擎的突发性,已经没太多时间给我去看那个比较好用了.(很多事情总是充满无奈)

网络模块:Unity5 提供了一套Net组件,在我花了两天时间去看了它的几个组件之后,发现根本不足以满足我们项目的要求.所以决定使用.Net自带的Socket自己实现.(约莫花了三天的时间)

继续阅读

昭和零食店的故事

偶然中发现这个偏养成类的游戏,虽然画风古老但是给了我眼前一亮的感觉.今天把这个游戏通关了,心里忽然有种暖暖的感觉.

这个游戏的主要玩法是通过进货,升级零食,玩具,打扫来进行养成收集,收集的道具有玩具,零食,顾客,还有最主要的信件.其中我觉得最有趣的是顾客与信件.

顾客

总共有12个顾客,每个顾客分别是不同的角色,有各种小孩,年轻人,老头,还有最特殊的妖怪打扮的小孩,每个顾客都需要在你升级到一定水平才会出现.然后每个顾客都被设定了一定的购买力.在玩游戏过程中 我莫名的对每个顾客的出现产生期待感.

继续阅读

射击游戏项目开发笔记 (一)

目前我使用的引擎对代码的编码方式有了非常严格的控制,一般的C++写法已经无法在引擎中运行了,由于目前项目准备使用protobuf来作为通讯数据,所以我必须实现一个动态解析protobuf的库,考虑到已经有人做了一个事情,而且做得很好(https://github.com/cloudwu/pbc),所以我就把云风大侠的c版本移植到目前使用的引擎上来.这篇文章主要记录的是一些修改事项和protobuf的一些基本内容,并非使用教程.

简要说明

protocol buffers是google提供的一种将结构化数据进行序列化和反序列化的方法,其优点是语言中立,平台中立,可扩展性好,目前在google内部大量用于数据存储,通讯协议等方面。PB在功能上类似XML,但是序列化后的数据更小,解析更快,使用上更简单。用户只要按照proto语法在.proto文件中定义好数据的结构,就可以使用PB提供的工具(protoc)自动生成处理数据的代码,使用这些代码就能在程序中方便的通过各种数据流读写数据。PB目前支持Java, C++和Python3种语言。另外,PB还提供了很好的向后兼容,即旧版本的程序可以正常处理新版本的数据,新版本的程序也能正常处理旧版本的数据。

ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。

继续阅读