之前apk虽然编译成功了,但打包却失败了;好不容易打包成功了,结果闪退;又历尽艰辛让它不闪退了,但刚进去却又黑屏了,这实在让人崩溃。
接下来是解决黑屏。之前的努力也没白费,一是编译速度快了,排除法就生效了,二是可以正常编译了,就可以输出信息来定位错误,所以就不怕它再搞事了。
初步判断黑屏是场景没正确加载导致的。在编辑器里运行时可以正确加载,但手机APK不行,需要在手机版启动时输出一些信息来观察一下。
APK在模拟器运行时通常是看不到Debug.log调试信息的,真机调试比较麻烦,模拟器可以用LunarConsole把信息输出到UI中。LunarConsole可以在Asset Store免费下载,下载后置入项目中,然后在Unity菜单执行Window->Lunar Mobile Console -> Install...。有了LunarConsole,APK运行后如有信息输出,就会显示在屏幕底部。LunarConsole下载地址:Lunar Mobile Console - FREE | GUI Tools | Unity Asset Store
这时再打包并运行,就看到了启动时的一大堆错误。
多数是找不到配置文件的错误,找到一个错误输出一下文件路径,发现像是PC端的相对路径,反正怎么看都不像安卓的目录形式。
定位到相关代码,在Global.cs中,发现有这么个USE_FB。可能是针对运营渠道的分包做的特殊处理,把#if...#else这部分代码去掉,保留#else之后的代码,就会正常读取安卓路径里的配置文件。
public static GlobalSetting Settings {
...
// #if USE_FB
// FBGlobalSettingSerializer.LoadFBGlobalSetting(Path.Combine(Utility.kRawDataPrefix, Path.ChangeExtension(PATH, Utility.kRawDataExtension)), out settings);
// #else
settings = Resources.Load<GlobalSetting>(PathUtil.EraseExtension(PATH));
或者在Player Settings...->Settings for Android->Other Settings里把USE_FB去掉也可以。
这时打包测试,终于可以看到第一个启动画面了,可惜到这儿又卡住了。
这一步有一定难度,报错是“DllNotFoundException: enet”。
网上搜到的大部分是路径错误原因,x86_64文件夹之类的。还有更糟糕的,说缺乏依赖的dll文件,要用depends找到依赖并想办法把缺失的dll凑齐。
我因此不幸被误导了,浪费了不少时间。后来我想,也许是安卓平台根本就不支持dll格式,按这个思路,在Unity的官方文档搜索“DllImport”,就找到了原因。安卓用的不是xxx.dll,而是libxxx.so。要找到so的版本,放入:Assets/Plugins/Android/libs/armeabi-v7a/才行。
参看:Unity - Manual: Building Plugins for Android
再到Player Setting里看,x86的选项确实已经不支持了。老的Unity版本,x86那里还可以点勾的,所以支持dll,现在只支持ARMv7的so文件了。
源代码里没有找到那些so文件,于是网上下载了一个较新版本的阿拉德APK文件,反编译后,从里面找到了so文件,复制过来再编译便成功了。
这时可以走到版本检测页面,进度条走完,毫无悬念,又卡住了。
这次卡在版本检测的位置,结合其它成功运行的阿拉德版本来看,这一步应该是检测并下载热更包。即使强行跳过了这一步,到下一步登录界面还会有版本检测,还会因此卡住。
走到这一步,必须要有一个架设好的服务端。我用的是一个已编译好代码搭建了linux服务端,并测试成功。但这个版本比客户端稍高一点,因此在启动时会查找热更包。
有两个办法可以暂时解决版本检测问题:
一是直接修改Assets\StreamingAssets\version.config中的版本号,改为同服务端版本一致的。
二是改Global.cs,就在前面提到的USE_FB下面的“settings = Resources.Load....”之后加上两句,目的是跳过热更包的检测。
// #else
settings = Resources.Load<GlobalSetting>(PathUtil.EraseExtension(PATH));
settings.isDebug = true;
settings.enableHotFix = false;
现在终于走到了登录界面,估计这回又该出问题了吧。果然,登录不上。这次怪我粗心了,忘了改ip地址。改ip也是在Global.cs里,前面一大堆,不懂的话就都改成linux服务器的ip地址。选服务器那里显示出我自定义的服务器名字,说明连接服务器成功了。
用户名只能用数字,而且至少要4位,都照做了还是登录不了,而且提示说是网络错误。又折腾了一会儿,不小心输入了个手机号居然成功了,后来才知道,原来至少要9位数字才行。这次的坑有点损,报错严重误导,害我花了半天时间去检查网络连接。
这次终于进游戏了,一下子玩了很多关。可是这次,期待中的大卡bug呢,居然一个都没出现。
这次都有点不习惯了,好不容易才遇到了一个小卡,吃掉一个靴子道具时会卡住不动,绕过去就没事。
这个bug在编辑器里也会出现,下面直接有报错信息,是数组越界错误。临时处理一下,直接定位到错误的代码行,把那个函数里的内容全注释掉就行了,好像不影响游戏。
还发现两个小问题,血条不显示红色,背包要点两下才能显示装备。这类错误都可以直接在编辑器调试,不用打包APK,比较容易修改,就留到以后慢慢改了。
总结:一个萝卜一个坑,任尔东西南北风。