编译阿拉德(二)

之前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,比较容易修改,就留到以后慢慢改了。

总结:一个萝卜一个坑,任尔东西南北风。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
罗马尼亚问题是一个经典的搜索问题,目标是找到两个城市之间的最短路径。其中,城市之间的距离以边的权重表示,从起点到目标点的路径必须经过每个城市一次且仅一次。本题要求使用 Python 代码实现深度优先搜索,并逐个点亮。 深度优先搜索是一种基于栈的搜索方法,在搜索的过程中,先遍历一个分支的全部节点,直到该节点的所有分支都被遍历完为止,然后回溯到前一个节点,重复执行上述步骤,直至找到目标节点或搜索全部节点。在罗马尼亚问题中,栈可以用来维护搜索的节点。 具体的实现步骤如下: 1. 定义一个字典,表示罗马尼亚的地理位置和距离信息。 2. 定义一个列表,表示从起点到目标点的路径。 3. 根据深度优先搜索的特点,使用栈来保存搜索的节点。 4. 设定起点为起始节点,将其加入栈中。 5. 当栈非空时,从栈中弹出最后一个节点,并查找其相邻节点。 6. 对于每个相邻节点,如果它不在路径中,将其加入路径中,并添加到栈中。 7. 如果相邻节点是目标节点,则返回路径。 8. 重复执行步骤5-7,直至栈为空,返回空列表。 实现代码如下: ```python romania_map = { 'Arad': {'Zerind': 75, 'Sibiu': 140, 'Timisoara': 118}, 'Bucharest': {'Urziceni': 85, 'Pitesti': 101, 'Giurgiu': 90, 'Fagaras': 211}, 'Craiova': {'Dobreta': 120, 'Rimnicu Vilcea': 146, 'Pitesti': 138}, 'Dobreta': {'Mehadia': 75, 'Craiova': 120}, 'Eforie': {'Hirsova': 86}, 'Fagaras': {'Sibiu': 99, 'Bucharest': 211}, 'Giurgiu': {'Bucharest': 90}, 'Hirsova': {'Urziceni': 98, 'Eforie': 86}, 'Iasi': {'Neamt': 87, 'Vaslui': 92}, 'Lugoj': {'Timisoara': 111, 'Mehadia': 70}, 'Mehadia': {'Dobreta': 75, 'Lugoj': 70}, 'Neamt': {'Iasi': 87}, 'Oradea': {'Zerind': 71, 'Sibiu': 151}, 'Pitesti': {'Rimnicu Vilcea': 97, 'Bucharest': 101, 'Craiova': 138}, 'Rimnicu Vilcea': {'Sibiu': 80, 'Pitesti': 97, 'Craiova': 146}, 'Sibiu': {'Arad': 140, 'Oradea': 151, 'Fagaras': 99, 'Rimnicu Vilcea': 80}, 'Timisoara': {'Arad': 118, 'Lugoj': 111}, 'Urziceni': {'Bucharest': 85, 'Vaslui': 142, 'Hirsova': 98}, 'Vaslui': {'Urziceni': 142, 'Iasi': 92}, 'Zerind': {'Arad': 75, 'Oradea': 71} } def dfs(start, goal, path=[]): path = path + [start] if start == goal: return path if start not in romania_map: return None for city in romania_map[start]: if city not in path: dfs_path = dfs(city, goal, path) if dfs_path: return dfs_path return None path = dfs('Arad', 'Bucharest') for city in path: print(f'Point {city} is Lightened') ``` 此代码使用深度优先搜索算法在罗马尼亚地图中找到从阿拉德到布加勒斯特的最短路径,并逐个点亮路径中的城市。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值