Unity3D 官方文档 平台特殊化之Android


版本:unity 5.6  语言:C#

 

 总起:

Android平台,虽然与IOS开发类似,但因为其硬件没有完全的标准化,所以会出现各式各样的问题。这一点在官方文档的第一段就提到了。

 

Unity Android基本环境的搭建还是比较容易的:

1.Unity本身没有下载Android插件的,首先 File -> Build Settings -> [切换到Android] Open Download Page 下载插件;

 

2.安装JDK,我使用的是Java8,不知道新出的Java9能不能用:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

 

3.安装SDK,这边我推荐安装Android Studio,再在其中中安装SDK:https://developer.android.com/index.html(进入该网页可能需要科学上网,然后下载SDK具体的包现在直连下载都很快了,不需要去网上找网友提供的包了);

 

4.安装Android模拟,我这边选择的是Nox英文版;

 

5.如果需要使用IL2CPP,安装一下NDK,5.6.3需要的版本是r10e,不要下错了。

 

Unity Remote

Unity远程调试插件,适用于Android、IOS和tvOS,一开始我以为这个可以直接在Unity中调试Android,实则不能,所以这个功能很鸡肋,不过也有他的使用场景,所以还是介绍一下吧。

 

调试步骤:

1.首先在Google Play中找到Unity Remote 5应用,把它下载安装到Android手机中,如果没有科学上网的同学,可以在百度上找一下;

 

2.将手机插上USB接口,允许USB调试,手机端就准备完成了,模拟器方面,我测试了3种:Genymotion可以直接运行,而Nox和Bluestacks没有效果;

 

3.接下来就是Unity中的设置,通过Edit -> Project Settings -> Editor,找到Unity Remote选项,将Device更改成Any Android Device:

 

 

4.然后直接运行Unity工程就会看到效果。

 

所以这个是做什么用的呢?首先大家可以理解为Android手机为一个扩展屏,然后Android手机的触屏输入、加速度、陀螺仪、相机、指南针、GPS和摇杆可以作为Unity工程的输入。

 

再然后……就没了,就多了个测试输入的功能,如果想要测试真机运行情况还是要打成APK在手机上运行。

 

这边再说一下两种特殊的情况:

1.如果是多台Android设备连接电脑的情况下,Unity会自动寻找第一台它找到的设备,而不能手动配置;

 

2.在手机端的显示图像质量很差,可以在Unity Remote的菜单中设置Compression为PNG,Resolution为Normal,图像效果就不会有损失了,但会占用更多的带宽。

 

出包界面:

在我们打包工程时,就会用到以下的一个界面:

 

 

 

 

♦ Texture Compression

图片纹理压缩格式,默认为ETC。

 

♦ Build System

在构建Android项目时最需要了解的就是这边两种Build System的区别:

 

1.Internal(Default)

这是一种比较传统的构建方式。可以这么说,开发纯Android项目时,过去主流使用的Eclipse就是使用该种构建,是一种ADT的构建方式。

 

打包一个APK经由以下几个步骤:

a.准备并打包Unity的Assets;

b.编译脚本;

c.处理Plugins插件;

d.如果Split Application Binary被勾选,会拆分资源到APK和OBB中;

e.使用AAPT打包Android资源;

f.将工程提供的Mantifest文件和第三方library的整合在一起;

g.将Java代码编译成DEX;

h.如果勾选了IL2CPP Scripting Backend,构建IL2CPP的包;

i.优化APK和OBB包。

 

2.Gradle(New)

Gradle是一种最新的打包方式,Android Studio就是使用该方式进行构建。这种构建方式会对项目进行更加严格的检验,使打出来的包更加稳定,总之是比较推荐的。

 

现在一个比较尴尬的情况是在整合第三方包时,网上大多数教程都是Eclipse时代的,而现在最好是使用Google推荐最新的Android Studio进行整合……两个IDE,虽然大家说学好一个,另一个不难……哎,出包这块Android确实比IOS耗精力的多。

 

♦ Export Project

勾选该选项能导出Unity工程为Android工程,Internal(Default)是不能导出为工程的,需要Eclipse的ADT项目,就选择Build System中没有介绍的第三个选项ADT(Legacy)(感觉ADT选项和Internal是一个意思,不知道Unity为什么要这么设置)。

 

至于Android Studio的工程,当然ADT导出的也能用,最好是选择Gradle进行导出。

 

♦ Development Build

如果该选项被勾选,Unity会设置一条分析隧道并启用CheckJNI,然后下面两个选项Autoconnect Profiler和Script Debugging也能被勾选。

 

Script Debugging应该就是Unity的日志信息了,但另一个选项不是很理解,Profiler指的是Unity的性能分析器吗?(希望有知道的大神可以留一下言)

 

Player Settings界面:

在上面的界面中点击player settings,那么Inspector窗口就显示该界面了。

 

前三个选项Resolution and Presentation、Icon和Splash Image和之前介绍的PC平台的内容其实大同小异,有需要的可以参考一下之前的文章,这边就不再多说了。

 

♦ Other Settings Rendering

 

 

 

 

Color Space 颜色空间,一般认为手机只支持Gamma空间,不过看了一下说是Android 4.3以上和OpenGLES3以上支持Linear了;

 

Auto Graphics API,Unity自动选取图像API,默认选取GLES3.1,如果设备不支持,会选择GLES3或GLES2。取消勾选后,移除GLES2的选项会出现两个选项Require ES3.1和Require ES3.1+AEP,可以强制使用3.1;

 

Multithreaded Rendering 多线程渲染,在主线程CPU利用率较高的情况下提升性能;

 

Static Batching 静态批处理,降低Drawcall,优化性能,和下面一个选项一样必勾选;

 

Dynamic Batching 动态批处理;

 

GPU Skinning 启用DX11/ES3的一种蒙皮技术;

 

Graphics Jobs(Experimental) 将图形渲染循环运行至其他CPU核心,只有Vulkan图形API才支持,实验性质的选项,可能会导致工程不稳定;

 

Virtual Reality Supported VR支持;

 

Protect Graphics Memory 强制图形缓冲显示经过硬件的保护路径,设备不支持则该选项无效。

 

♦ Other Settings Identification

 

 

 

 

Package Name 包名,Google商城的唯一ID,IOS和Android共享该选项;

 

Version 版本号,IOS和Android共享该选项;

 

Bundle Version Code 内部版本号,保证每次发布新版本大于之前的数字就可以;

 

Minimum API Level 最低API等级;

 

Target API Level 打包API的等级。

 

♦ Other Settings Configuration

 

 

 

 

Scripting Backend 脚本,IL2CPP和Mono2x,Mono2x就是C#,而IL2CPP是说将C#转成CPP,其中IL2CPP中的IL是C#编译后的中间语言;

 

API Compatibility Level 脚本API的版本:.Net2.0和.Net2.0 Subset;

 

Disable HW Statistics 不将硬件统计的信息发送给Unity官方,只有专业版才能勾选;

 

Device Filter 选择应用程序在指定CPU上运行:ARMv7、x86;

 

Install Location 指定程序安装的位置;

 

Internet Access 网络访问权限;

 

Write Permission sd卡写入权限;

 

Android TV Compatibility 安卓TV兼容选项;

 

Android Game 将应用程序标记为游戏;

 

Android Gamepad Support Level 游戏手柄支持等级;

 

Scripting Define Symbols 脚本编译时的标志设置;

 

♦ Other Settings Optimization

 

 

 

这边的选项基本和PC端的差不多,不同的我用粗体标注了。

 

Prebake Collision Meshes 只在build游戏时添加碰撞盒;

 

Keep Loaded Shaders Alive 保证Shader不会被卸载;

 

Preloader Assets 预先读取的Assets列表;

 

Stripping Level 代码剥离等级,只有IL2CPP才能使用;

 

Enable Internal Profiler 启用内部分析器,允许logcat获取设备分析的数据;

 

Vertex Compression 顶点压缩,选择模型会压缩的数据,比如可以选择everything,然后去掉positions和lightmap UVs。当然每个每个模型在导入时,可以设置独立的该参数,会覆盖掉该选项;

 

Optimize Mesh Data 优化Mesh数据,勾选该选项会移除材质所不需要的Mesh数据,例如tangents、normals、colors、UV。

 

♦ Publishing Settings

 

 

 

 

Keystore 可以创建密钥库,在对接某些第三方库时需要一个密钥库,在你指定了一个密钥后,每次重启Unity后打包API都会要求输入密码;

 

Split Application Binary 将包体分割成APK和OBB,在Google Play Store上发布100MB以上的应用程序时,需要勾选,不过我们这边连Google都上不去,所以并没有什么用。

 

总结:

这边介绍的主要是官方文档上提供的知识,Android和Unity对接的文章一搜一大把,当然很多是过时的。

 

这边个人推荐的对接方式是Android Studio打包aar给Unity使用,个人原本计划打算写一篇相关的博客的,不过还是得看时间了。这边介绍另一位大神的博文:http://blog.csdn.net/zhangdi2017/article/details/63254563。大家可以参考一下。

 

个人:

最近买了很多软件工程的书,主要是Bob大叔的几本书还有重构、设计模式什么的。

 

一开始看《程序员的职业素养》,想着打发一下闲暇的时间,可我看了第一章,我着迷似的阅读该书,程序在出包时也忍不住翻上几页。花了三天时间把它看完了,对里面的一些观点不能再认同。

 

尝试了一下单元测试,花了几个小时把我之前设计的UI框架理清了,感觉也是很棒,不管修改了什么东西,只要单元测试能运行正常基本也就没什么问题。