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框架理清了,感觉也是很棒,不管修改了什么东西,只要单元测试能运行正常基本也就没什么问题。