摄像机切换

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

  public GameObject mainCamera;     // 通过在可视化界面中拖拽赋值
  public GameObject nextCamera;

  // Use this for initialization
  void Start () {

  }

  // Update is called once per frame
  void Update () {

    // 键盘数字1按钮抬起时
    if (Input.GetKeyUp (KeyCode.Alpha1)) {
      falseAllCamera();
      mainCamera.active = true;   // active 属性置为false之后对象绑定的脚本也讲不执行
    }

    if (Input.GetKeyUp (KeyCode.Alpha2)) {
      falseAllCamera();
      nextCamera.active = true;
    }

  }

  void falseAllCamera () {

    mainCamera.active = false;
    nextCamera.active = false;

  }
}

 

改了一年bug的感想

首先要提高的是思考问题的严谨程度,只有在编程时尽可能考虑到所有情况,才能避免无休止地改来改去bug,从根本上提高效率,养成良好地思维习惯,才能随着时间地推移让自己变得更强。业务逻辑的实现谁都可以,好的程序员应该吧大量时间花在初期设计,画流程图,理清思路而不是匆匆敲代码。

先谈稳定性,我在编程时候必须多花时间考虑清楚这个需求可能出问题的更多方面和我具体实现时候的注意事项,这也就是有人说经验越多编程反而越慢,比起匆匆动手完成一个功能然后无休止地修改bug,在最初编程时候多考虑一下会更有效率。培养良好的思维习惯,这是从现在我就要有意识做的事情,根据崔江的观点,做一个东西之前应该尽可能考虑全可能遇到的问题,90%以上就是不错的结果,所以我要做的事情是:

回顾bug列表,把其中的逻辑问题都梳理一下,强化一下可能出问题的通用情况,我会专门整理个地方过一遍我遇到的逻辑疏漏,来让自己的思维更加缜密。

1、在进入正常逻辑之前确保该初始化的东西都被初始化了
2、论证一个逻辑是否有问题,考虑整个逻辑过程,按顺序过一遍,注意可能其中有一段空白没被考虑,参考角标更新时间
3、对于一些非必现问题,不要把责任推给网络或者机器特性,要根据问题的反馈,分析出其中可能发生错误的点,参见取不到canSellCardList缓存问题,是因为新手引导之后的一步手动清掉了
4、编程中许多环节我会假设数据已经正常,我该拿到的东西都拿到了,而且是我想要的形式,比如一个list我会对它做一些数组独有的操作,但是如果这个东西不是数组,是null就会报错,或者json的层级问题导致我取一个对象下的属性取不到,实际上这个属性在上一层结构或者下一层结构,还有可能拿到一个非法值,我就去比对,又判断在不相等时候做操作,这样非法值肯定不相等,但逻辑已经错了。首先在编程时候就要充分考虑到每一个数据结构都可能不是我想要的形式,为此我会广泛使用一些诸如typedef,instanceof之类的语句,当发现异常后输出对应的日志,先不必着急做容错,必须仔细论证整个流程,确定是一些不可预见因素如网络异常导致,再考虑做容错。
5、在准备发更新包或者大版本打包时,确认自己已经做的修改都已经提交SVN,只是在这种时候多做一点防止疏漏。
6、在一些有有效期的功能中要考虑到过期之后程序会怎样处理,如BOSS逃跑后,前端可以加上跳转
7、游戏的逻辑中尽量不要写死固定数值,范围的判断要动态获取图片的范围
8、修改一个bug时把可能导致这个bug的所有原因都改掉,不要只改报出来的那个
9、在条件判断语句中首先要考虑条件两边的值是否都是合法值,确定两边都是和法值之后,考虑边界值,即 = 号的情况,
说到这儿,在对后台传来的数据做处理的时候要考虑到后台传入数据非法的情况,如果这个数组为空是传一个空数组还是
传一个null,说白了还是在使用特定数据结构时候做好检测
10、需要客户端做限制的情况要考虑条件是否和后台一致,确定好后台数据的值和格式招揽倒计时是因为客户端取上次抽
时间加一天,如果上次抽时间是几天之前,加了一天还是可以免费,应该取当前时间。
11、遇到更新用户信息的操作,考虑用户信息面板的同步更新
12、注意对极限边界状况的测试,如社团人满了,测试如果需要结果在 20 – 30 之间,测试的时候,要重点关注20,30,<20, >30的情况
13、解决一个隐藏较深的bug先解决肯定可以确定的表面bug,有一种情况就是藏得深的不好解决但是重要而浅的好解决不重要,这时候不要着急解决那些藏得深的,着急可能会误入歧途,先把表面的bug解决之后再看可能隐藏很深的bug也没有了,二八定律
14、利用localStorage时候要注意区别不同账号和同一个账号不同区,在设置item的时候key要加上IMEI和ip地址
15、cocos2d 2.x的一个很大的坑是隐藏层的接受触摸事件问题,最好别弄隐藏层,就删除掉不存在的层,隐藏的层一定要关掉触摸事件,不然会因为可见层没有吞掉事件触发隐藏层的点击事件造成奇怪bug,切忌
16、用log打印日志的时候要确定要打印的数据结构合法,比如打印一个对象的某个属性要确定这个对象存在,不然访问undefined的某个属性js会报错导致程序崩溃

弱联网游戏缓存层设计思路

进入游戏开发行业也有一年多了,经历了几个产品的完整开发,印象最深刻的就是缓存层的设计,记录一下供以后借鉴。

弱联网游戏指非实时联网游戏,只在需要修改数据的时候向服务端发送请求,正是这样的特点让缓存层的存在成为了必不可少的一个环节。

缓存层设计的基本想法是根据接口的不同,把查询接口(一般指get请求的接口)返回的数据保存在一个对象里,属性名就是接口,这里要注意的一点就是接口的url要去掉最后的发送时间。一般游戏登陆的时候这些json就准备好了,所以检查客户端缓存问题的方法也很简单,重启游戏看好没好就行了。当发起网络请求的时候,先检查本地缓存对象里有没有,如果有,直接从本地缓存里取,省去了请求网络的步骤。

json准备好后,要写一些专门的Controller类,提供接口更新这些数据结构的某一项,在post请求接口成功返回后,客户端和服务器做同样的修改,而不是服务器修改完之后把新的数据再返回给客户端做更新。

当然有些情况下post请求后数据的更新客户端无法和服务端同步,如查阅大量表格,或者新增数据项,可以调用清除缓存的接口清掉缓存。当然这里有很多可以优化的地方,新增数据项可以通过在本地放静态json模板添加,查表可以在本地放静态表。

总之缓存层的核心思想就是把重复查询的东西存在本地,减少网络请求,如果非要请求网络,那么减少每次回传的数据。

Unity 4.6.1f1 开发Tips

1、Unity所有脚本都需要绑定到具体游戏对象才能生效,控制类脚本需要长期存在可以绑定到摄像机。

2、Unity脚本的类的public属性可以从可视化面板通过拖拽赋值,有的属性会在游戏运行时拿到对象实例,给代码阅读增加了难度。

3、Unity项目名称无法后期修改,至少我还没找到办法,所以最初起名时候谨慎。

4、从Asset Store上下资源的时候在Project里搜,然后把搜索范围设定为Asset Store,选择了要下的资源后必须点 Open Asset Store从store里先download一下,然后直接引入就行了,不能直接点Import package,不然会报错 Error Building package。

5、Unity利用面板通常给数组容器等赋初始值为模型Prefab,然后通过脚本去实例化模型,拖拽面板的时候为了防止点击让面板切换可以点击面板右上角的 锁头 图标,锁定面板,记得之后要解锁。

6、Default GameObject Tag: Player already registered 警告原因为Unity的系统Tag里已经添加了Player,无需开发者手动添加。

7、Unity 雾化,我的理解摄像机远处的物体会被笼罩一层有颜色的雾 ,具体应用方法Edit ->Render Settings

unity_render_settings fog

8、很重要一点Unity中脚本的enabled=false后,如果这个类已经被实例化,那么它身上的方法依旧是可以被调用的。

Git实用技巧整理

1、git 安装 Mac 使用 homebrew(https://github.com/mxcl/homebrew):brew install git

2、初始化git仓库在一个项目根目录下 git init

3、git add 添加文件到暂存区 git commit 提交文件到本地

4、git remote add origin https://github.com/mycmessia/项目名.git‘ 执行这部之前要先去git网站在远程创建仓库

5、git push -u origin master 把当前项目的master分支推送到远程master分支

其他常用操作见 Git常用命令整理

6、作为一个版本管理软件,最重要的东西就是回退版本,两个命令

git reset –hard commit id 这个命令是直接回退包括工作目录下的文件到某个指定版本,提交记录也会回退

git reset –soft HEAD~n 这个是只回退提交纪录但是工作目录的文件不会回退,这个n代表最新提交前第几个,比如写个2,那么最近的两个提交纪录就都没了

7、git另一个重要功能就是分支,用于在不破坏原有代码的基础上添加新功能

git branch // 查看当前项目所有 local 分支

git branch | grep xxx // list all branches whose name contains xxx, careful when using this in a script, see this link for more info

git checkout branch_name // 跳转到指定分支

git push origin --delete branch_name // Delete a remote branch in origin

8、Discarding unstaged changes(changes haven’t been added)

git checkout -- .

9、Hard reset one file

git checkout HEAD -- my-file.txt

10、Renaming a remote

git remote rename oldname newname