【坑】

“坑”有几个解释:
1. 地面上凹下去的地方。
2. 地洞,地道。
3. 陷阱。
这里我提到的坑,是在技术上遇到的一些问题。把这些“坑”记录在这里,与君共勉。

Unity资源打包路径问题

var path = "Assets/Language//China/1.txt";
var obj = AssetDatabase.LoadAssetAtPath(path, typeof(object));
这里obj == NULL。原因是path中有//。需要replace("//", "/");

Ruby的Mysql插件账号、密码不对的问题

使用Mysql插件进行数据库的链接,若对应ip的账号,密码配置错误,会出现

Access denied for user 'dbname'@'ip' (using password: YES),但是这个ip竟然是本机ip,不是外网的ip

Unity && IOS从后台切换到前台后, Socket的问题

在IOS平台中,从后台切到前台后,立即对原来的socket进行send调用,会出现卡死的问题,即使采用try catch也是概率性卡死。原因是切回前台后,socket已经shut down了,直接调用socket.send就必然用问题。所以需要判断socket是否需要关闭原来的,重新创建一个新的socket.

Unity && IOS中socket的SIGPIPE信号的处理

虽然在main()中,unity已经ignore了SIGPIPE信号,但是游戏从bugly中还是抓到了SIGPIPE的crash。猜测有可能第三方sdk重新打开了这个信号SIGPIPE

资源更新的问题

总体说是资源更新丢失的问题,原因有下面:

  1. 版本号一直没有升级 老资源遗漏在手机端,导致新出的客户端读取的总是老资源。
  2. 资源列表中缺少资源出版本,之后修改资源,最后切分支,而修改的资源被遗漏。
  3. 客户端过滤部分资源 跨分支出资源包,客户端资源版本号大于更新的资源版本号,所以直接过滤。

解决办法

  1. 现在做了一个资源版本号,只读取更新中比包中资源版本号大的资源。
  2. 版本一定在分支中出,保证资源不丢失;资源更新再同步到分支上
  3. 避免跨分支出资源包,若需要跨分支出资源包,需要增加一个资源最小版本(客户端资源版本号+1)

The asset bundle '<unknown>' could not be loaded because it refercencs scripts that are not compatible with the currently loaded ones

这个是Unity脚本序列化的问题,脚本序列化必须同时满足:

  1. public类型,或者有[SerializeField]
  2. 不是static
  3. 不是const
  4. 不是readonly
  5. 类型必须是Unity可序列化的类型

Unity可以序列化的类型有哪些:

  1. 自定义的,非abstract的类,且有[Serializable]
  2. 有[Serializable]的结构体
  3. UnityEngine.Object的子类型的引用
  4. 原生类型(int, float, double, bool, string, etc)
  5. 以上类型的数组
  6. 以上类型的List

我们有一个脚本,其中有两个属性(debugPlay, debugStop)通过UNITY_EDITOR_WIN宏包起来,但是在出资源包的机器中这个宏是不生效的,也就是序列化的内容中没有这两个属性。但是在editor window下需要加载这个assetbundle就会出现反序列化失败的情况。继而也就出现上面的错误。

同时测试发现,属性不能有下面的变化

  1. 不能增加属性
  2. 不能删除属性
  3. 不能打乱属性的顺序

MultiDex拆分Android包,出现java.lang.NoClassDefFound的问题

这个是因为MultiDex的问题。在Android 6.0 以下,需要手动加载剩余的class.dex

quick-cocos2dx在window下没有背景音乐,且音效不可关闭

查看了源码,发现cocos在window中的SimpleAudioEngine.cpp 中,音效大小的接口hard code

微信Android登陆收不到OnResp(BaseResp resp)

wxapi目录必须在包名下创建,否则就OnResp就不会调用,且Activity的class名必须是WXEnteryActivity

微信分享的thumb大小必须小于32K(32768 Byte)

否则就不能调出微信的客户端

Unity与IOS交互

对于byte[]类型,必须放在参数的最后一位。或者就直接把byte[]转化成string转递给object-c

aliyun