Unity3d 安卓开发问题总结

开发了半年基于Unity的安卓应用,项目也基本快完结了。在开发过程中遇到了很多坑,然而Unity的技术支持几乎都在英文论坛里。直接百度,真的很难解决问题。本篇对这半年的开发经历做一个总结,希望能帮助其他开发者。

https://forum.unity.com/ 这个是Unity的官方论坛,个人认为解决技术问题很好的途径,就是回复不是很稳定,看情况,然后网络访问也不是很稳定。下面就从我在上面的提问开始写:

1. Gradle build failed 

原帖地址:https://forum.unity.com/threads/gradle-build-failed.647581/#post-4910888

错误信息为:

stderr[
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring root project 'gradleOut'.
> Failed to find Build Tools revision 29.0.0

这个错误信息其实就是Unity选择了一个不存在的安卓BuildToolsVersion版本。这个问题的出现是由于两个原因:

a. 出现问题之前我PC上一直都用的Android 28,在Player settings里面目标API Level也是Android 9(28)。但是突然某天Android Studio给我下载了"29.0.0-rc1"这个测试版本的SDK(Unity使用的是Android Studio下载的SDK)。从此,Unity在Gradle Build的时候,并没有按照我设置里面的API Level 去直接选择Android 28这个版本,而是选择了29.0.0-rc1这个最新版本的BuildToolsVersion。这个可能是由于BuildToolsVersion总是选择最新的。

b. Unity即便选择了这个29.0.0-rc1 BuildToolsVersion版本,但是它写入Gradle文件的时候,却只写入了29.0.0. 所以,最终Gradle Build的时候就找不到29.0.0这个BuildToolsVersion版本。

解决方法:

1. 用Unity自己下载SDK, 在Android Studio中导入项目时选择使用项目中的SDK路径,即Unity的SDK路径。

2. 在安卓的SDK目录下删除29.0.0-rc1这个版本。

3. 用Unity导出Android Studio项目,然后在Build.gradle里把 buildToolsVersion '29.0.0'改为你想用的那个。

2. 在StreamingAssets中加载.XML文件可能会解析错误

原帖地址:https://forum.unity.com/threads/how-to-load-a-xml-file-in-android.662320/

首先,StreamingAssets里面的资源属于压缩只能读取的文件。所以要使用UnityWebRequest的方式来读取,不能直接去用C#文件流打开。否则在编辑器里模拟没问题,但是无法在设备上使用。

解析.XML文件的错误是这样的:在编辑器里面模拟加载没问题,在设备上打开也没问题,读取的字符串看起来也正常,就是反序列化的时候出现错误。 

原因是由于.XML文件的BOM造成的。BOM是文件刚开始的一个标记数据,标记字节顺序的,占三个字节:“EF BB BF”。这三个字节后面的才是反序列化的内容。在安卓上读取到BOM要跳过,把BOM后面的字符串进行反序列化操作。

解决方法:

1. 生成.XML文件的时候不要带BOM;

2. 读取的时候先判断前三个字节是否为BOM,如果是就从BOM后面开始反序列化。

3. Unity2018.x升级到Unity2019.1.0.f2时的图片撕裂问题

原帖地址:https://forum.unity.com/threads/the-images-become-weird-wrong-scale-since-i-upgraded-my-project-to-2019-1-0f2.670078/

upload_2019-4-30_10-59-25.png

如上图中所示,左右两个Image使用的是同一个Sprite,但是显示效果完全不同。我也确认了右边的Image不存在拉伸或压缩等行为,大小和Sprite的分辨率是一样。感觉这个问题应该只是存在于升级过程中,因为升级之前完全没出现过。

解决方法:

把Image用RawImage来替换掉。

4. 触摸屏导致的点击事件异常

原帖地址:https://forum.unity.com/threads/i-have-a-tough-problem-with-screen-touch.710951/

现象:由于我们使用的是红外触摸框,不知道某种原因用户在点击的时候,Unity会同时收到两个点击事件。这个在一些资源释放操作时会产生严重的bug。这是一个很隐蔽的问题,而且由不同的代码带来的错误现象也是不同。

解决方法:

点击的时候,把函数改为不响应状态。延时一段时间(如1ms)后再恢复函数的响应。

5. 加载位于AssetBundle或者Addressables中的Video Clip的注意事项

原帖地址:https://forum.unity.com/threads/how-to-disable-caching-compressionenabled-when-caching-a-videoclip-included-addressable-bundle.740708/

首先,不论是AssetBundle还是Addressables,Video Clip所在的那个资源包都要选择未压缩。否则你大概会收到这个错误消息:

AndroidVideoMedia::OpenExtractor could not translate archive:/CAB-5b4cd0a92d354858f98b1392dd686137/CAB-5b4cd0a92d354858f98b1392dd686137.resource to local file. Make sure file exists, is on disk (not in memory) and not compressed.
AndroidVideoMedia: Error opening extractor: -10004

不用怀疑什么格式问题,就是压缩造成的问题。

另外,Addressables的机制是从Remote服务器下载AddressableAssets然后保存在本地的Cache里面,再从本地已下载的Cache文件中把VideoClip加载到程序里。所以在请求更新包含VideoClip的AddressableAssets的时候,要把Caching.compressionEnabled设置为false,即不压缩保存。

但是这会带来另一个问题:Caching.compressionEnables如果全局都设置为false,那么其他的素材占用的空间一下子也会增加几倍。目前Unity还不支持在下载Addressables的时候选择是否要压缩再Caching。

解决方法:

把VideoClip相关的Assets单独出来处理,不要和其它的放在一起。比如,统一先把Caching压缩关闭再去更新VideoClips。更新结束后再把Caching压缩打开更新别的Assets。Addressables这个系统确实省了很多事,但是目前感觉还不够成熟。

猜你喜欢

转载自blog.csdn.net/luoyu510183/article/details/100941802