第1章: 概述
概述
学前必备知识
C#(C# 四部曲)
Unity(Unity 三部曲)
UI(UI 四部曲)
数据持久化(数据持久化 四部曲)
学了这些知识你才能利用Unity开发游戏
做好了游戏才会使用本套课程的知识
可选:
Java 或 Kotlin 编程语言(用于 安卓 开发)
Objective-c 或 Swift 编程语言(用于 IOS 开发)
主要学习内容
Unity中的Android开发
Unity中的IOS开发
学习完毕后能达到什么水平
能够将项目发布到Android、IOS平台正常安装运行
能够让 Unity 和 Android、IOS平台相关功能进行交互
能够调试Unity发布的 Android、IOS 平台上的应用程序
能够结合移动平台任意第三方SDK提供的说明文档进行SDK接入
掌握基础的Android、IOS平台的开发语言,协助完成上述内容
第2章: Android
第1节: Unity开发和打包Android
如何使用Unity进行安卓游戏开发
知识点一 原生安卓游戏开发如何进行?
要进行原生的安卓(Android)游戏开发,我们需要掌握的知识有:
Java语言 或 Kotlin语言
对应的开发工具(IDE):AndroidStudio(推荐)、Eclipse、IntelliJ IDEA等
Android 开发流程
Android SDK 的使用
等等
学会了这些,我们才能开发在安卓(Android)平台上运行的应用程序(游戏、应用等)
而Unity作为跨平台的引擎,可以让我们在Unity中进行开发后,直接发布安装包
可以让使用Unity开发的游戏、应用在安卓(Android)平台上运行
所以,我们不用特别深入的学习安卓(Android)开发相关
只需要大概了解它的部分知识即可(从需求触发,需要时再去学习了解即可)
注意
目前市面上的安卓(Android)开发岗位,大多数情况下,Java程序员就可以兼容
一般安卓(Android)开发,主要是针对安卓(Android)平台上的应用开发
由于跨平台引擎(Unity、UE、Cocos等)的普及,几乎没有公司会基于单一平台开发游戏
都是使用跨平台引擎,方便多平台发布,一劳永逸
知识点二 Unity如何进行安卓游戏开发?
Unity进行安卓开发,我们需要学习的知识点有:
基础(对于 单机游戏、独立游戏开发者)
Unity内发布安卓应用程序安装包(.apk),并运行在安卓手机上
Unity发布安卓工程后,在AndroidStudio中发布安装包(.apk),并运行在安卓手机上
调试相关
进阶(商业游戏开发)
Java基础语法、Kotlin基础语法
Unity 和 Andorid 交互
安卓平台 第三方SDK接入
新版Unity(2019及以上)打包安卓应用程序
知识点一 Unity2019及以上 发布Android准备工作
通过UnityHub安装Android平台相关工具
Android构建支持
Android SDK(安卓软件开发工具包)、NDKTools(本地开发工具包)
OpenJDK(Java开发工具包)
这些是发布安卓应用程序必备内容
安装了他们,才能发布安卓应用程序
注意:Unity支持Android 5.1及以上版本
知识点二 发布必修改的设置
在File —— Build Setting —— Player Setting中修改
公司名
游戏项目名
版本号
默认图标
Other Settings —— Package Name(必须修改设置)
Other Settings —— Minimum APILevel
知识点三 测试发布的apk文件
真机安装测试
使用pc模拟器测试
总结
Unity2019及以上的 Android 应用程序发布 非常的简单
只需要安装对应的内容
设置基础关键信息 便可以发布安卓.apk后缀的应用安装程序
补充——老版本打包(2019以下)
任务学习 - 泰课在线 -- 志存高远,稳如泰山 - 国内专业的在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG - Powered By EduSoho (taikr.com)
第2节: 基础知识点——Unity发布参数相关
Build Settings参数相关
思维导图
Player Settings参数基础部分
思维导图
Other Settings参数相关 第一部分 渲染设置
导入知识——图形程序接口概念
任务学习 - 泰课在线 -- 志存高远,稳如泰山 - 国内专业的在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG - Powered By EduSoho (taikr.com)
思维导图
补充——伽马空间和线性空间
伽马空间
概述
伽马空间是处理图像和视频信号时经常提到的一个概念,它与图像的亮度和颜色表示方式密切相关。伽马校正(Gamma correction)是一种调整图像亮度的非线性操作,用以模拟人眼对光线的非线性感知,改善图像显示效果,特别是在高亮区域。
伽马校正和高亮过曝
高亮区域过曝通常是因为从低亮度值到高亮度值的转换过程中,亮度增加的速度超过了线性关系,导致高亮区域的细节丢失。
在未进行伽马校正或应用不当的情况下,图像的亮度变化可能不够平滑,容易出现过曝现象。
伽马解码的工作原理
伽马解码是伽马校正的逆过程,旨在将显示设备上的颜色值转换回更接近线性的亮度空间。这一过程通过对色彩值进行幂运算完成,具体公式为:C线性=(C伽马/255)γ
其中C线性是解码后的线性空间的颜色值,C伽马是伽马空间中的颜色值,γ取值为2.2。
这也是许多将伽马的文章喜欢把颜色拿浮点数表示的原因。
RGB颜色和浮点数表示
在数字图像处理中,颜色通常通过RGB值表示,范围从0到255。使用浮点数表示颜色可以提供更广的动态范围和更精细的色彩控制,特别适合于高动态范围(HDR)图像和精确的颜色计算。
伽马解码通常独立应用于RGB颜色空间中的每个颜色通道。
过曝的临界点与伽马解码
当校正后的RGB某个颜色值达到255,即图像的最亮点(纯白色),这种情况下,伽马解码后的颜色值理论上仍然保持不变,因为它已经是该颜色空间能表示的最亮颜色。
那就存在一种情况,即某个RGB颜色值处于过曝的临界点,能够通过伽马解码正常转换回较为自然的亮度值。但如果颜色值超过这个临界点,即过曝,可能导致高光细节的丢失,因为由解码公式可知,(255/255)γ 无论伽马值为多少,结果依然不变,所以超出临界点的亮度信息无法恢复,解码后依然还是255。
线性空间
线性空间:在线性颜色空间中,颜色的亮度值直接与其数值成比例,这更接近光线在现实世界中的物理行为。线性空间的一个主要优势是它可以更准确地进行颜色混合和光照计算,使得它非常适合需要高度现实感渲染的3D游戏和视觉效果。线性空间的上限高于伽马空间,因为它能更精细地表达高亮区域的细节。
总结
sRGB是预先进行了伽马矫正而直接获得的颜色空间。
伽马空间对于高亮颜色会有过曝(输入的颜色会被校正,校正后等于1的颜色还原的时候依然是1,但是暗处颜色记录更多,适合风格化游戏。
线性空间基本就是输入的颜色和数值完全相同,上限高于伽马空间,符合现实的颜色规律,适合大部分3D和现实风格的游戏。
当切换到线性颜色空间的时候,unity在贴图的导入设置面板中有“sRGB(Color Texture)”选项,勾选它,告诉Unity这是一张sRGB贴图(伽马贴图),需要对它做sRGB解码才可以获得用于光照计算的数据;不勾选,即表示这是一张线性贴图,这张贴图的颜色数据可直接用于光照计算
对于贴图的srgb选项,如果美术是伽马空间出图的就勾选,如果是线性空间出图就不必勾选。
现代大部分屏幕依然默认采用伽马2.2和SRGB的设置。现代保留伽马2.2的一个大原因是:许多旧时的文艺作品 工业产品,以及现代的许多工作流还基于2.2的时代,所以产家为了适配性,暂时采用默认伽马2.2,可选线性的方案。
Unity在使用线性色彩空间时,并不是简单地将图像以伽马1.0(纯线性)的形式直接输出到屏幕。而是有一套转换流程,确保从线性色彩空间到屏幕显示这一过程,图像能够适配大多数现代显示设备通常采用的伽马2.2标准。所以不用担心unity的线性空间会导致画面失真偏灰
参考
伽马校正(Gamma Correction)与sRGB - 知乎 (zhihu.com)
Gamma空间和Linear空间 全解析 - 知乎 (zhihu.com)
Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗? - 知乎 (zhihu.com)
深入理解线性空间与HDR - 简书 (jianshu.com)
Other Settings参数相关 第二部分 Vulkan和身份证明设置
思维导图
Other Settings参数相关 第三部分 配置设置
介绍
Other Settings参数相关 第四部分 脚本编译设置
导入知识——C#中的 unsafe 关键词
任务学习 - 泰课在线 -- 志存高远,稳如泰山 - 国内专业的在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG - Powered By EduSoho (taikr.com)
思维导图
Other Settings参数相关 第四部分 优化相关设置 堆栈跟踪设置
思维导图
Publishing Settings参数相关 密钥库管理器
导入知识——Android 中的签名和代码混淆
任务学习 - 泰课在线 -- 志存高远,稳如泰山 - 国内专业的在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG - Powered By EduSoho (taikr.com)
总结
签名:安卓用来确定apk唯一身份的参数,假设我们下载一个新的apk的时候,安卓可以通过包名+签名的形式得到我们手机里是否已经拥有这个apk。
代码混肴:打包文件的时候将执行代码故意模糊化,让反编译难度上升。
介绍
Publishing Settings参数相关 其它参数
思维导图
第3节: 基础知识点——Android Studio发布相关
AndroidStudio打包安卓应用
知识点一 通过Unity导出Android Studio能够打开的工程
步骤
设置导出基本信息:公司名、游戏名、图标、包名等关键信息
在File——>Build Settings中,勾选 Export Project 选项
点击Export 导出按钮
此刻打包出来的文件就不再是单一的APK文件,而是可以被Studio二次编辑的文件夹形式。
知识点二 在Android Studio中打开Unity导出的工程
步骤
打开Android Studio
新选择 打开工程
选择 之前导出的对应文件夹
弹出提示时,使用Android Studio中的 Android SDK,可以避免打包失败
等待工程加载结束
更新Gradle版本,保证之后打包成功
知识点三 使用Android Studio生成应用程序apk
步骤
1.在 工具栏——>Build——>Build Bundle...——>Build APK
构建一次工程,保证构建成功,根据报错解决问题
常见问题:
1.The option 'android.enableR8' is deprecated 由于新版本Gradle默认使用R8混淆
所以不需要这个选项设置了
在Project选项中 找到 gradle.properties 删除 android.enableR8
2.SDK Tools 版本不匹配
更新SDK使用的路径,使用Android Studio自己的路径,或者更新SDK
2.在 工具栏——>Build——>Build Bundle...——>Generate Signed Bundle
发布APK,可以设置密钥库相关内容后进行打包即可
3.测试生成的apk文件
总结
如果不需要将Unity功能嵌入到Android项目中进行二次开发
我们一般不使用该种打包方式
直接在Unity中进行打包更加的方便
讲解此种打包方式,是为了之后的知识做准备
我们只需要保证能够正常通过Android Studio打包Unity导出的工程即可
第4节: 基础知识点——调试相关
Unity内调试安卓应用程序
知识点一 调试指的是什么?
我们在这里提到的调试,主要指的是 安卓手机的真机调试
我们在开发前期,开发测试功能都是在Unity内完成的
当我们真正把发布的 apk 安装到手机上运行时
由于运行环境的改变(开发时在 Windows 或 MacOS,使用时在Android或IOS)
我们很多时候需要在真机上进行项目的 性能分析 和 bug处理(断点调试修复bug)
那么这时我们就需要学习如何通过Unity连接真机 来进行项目调试了
我们这节课就来学习这些内容
知识点二 准备测试用安卓手机
1.安卓手机需要打开开发者模式
可以根据自己的手机品牌自行搜索开启方式
一般的操作方式:设置——>关于手机——>版本号(点击n次版本号)
便可开启
2.完成第一步后,在手机的开发者选项中 开启 USB调试功能
一般开发者选项会在:设置——>系统——>开发者选项中
找到USB调试功能 开启它
3.将手机通过USB接入到你的电脑上,在手机上一般会弹出一个提示
选择允许进行USB调试
现在大部分手机还会提问允许的usb用途,设置为文件传输即可。
知识点三 在Unity中进行调试相关设置
在 File ——> Build Settings 中进行调试相关的设置
1. 完成知识点一相关内容后,可以在 Run Device 的设备列表中看到你的安卓设备
如果Refresh刷新后也无法看到你的设备,证明你的连接有问题,或没有开启USB调试模式
首先去完成知识点一
2. 调试相关设置
剖析器 性能问题排查相关(勾选了他们,我们才能在Unity的剖析器中获取完整信息)
开启 Development Build 开发模式构建
开启 Autoconnect Profiler 自动连接分析器
开启 Deep Profiling 深度剖析
断点 调试相关(勾选了他们,我们才能进行断点调试)
开启 Script Debuggins 脚本调试
开启 Wait For Managed Debugger 等待托管调试器
3. 项目基本的发布设置相关内容一定要设置正确
比如:包名、项目名、公司名、密钥库等等
知识点四 Unity连接安卓真机进行项目调试
点击Build and Run
这时Unity会自动发布apk应用该程序,然后安装到设备上自动启动
这时我们就可以
1. 利用Unity的 剖析器(Profiler窗口)来分析应用程序
2. 进行断点调试,排查问题
注意:如果想要断点调试,自动启动应用程序后,弹出的提示窗口 不要点击OK
先在VS中 工具栏——>调试——>附加 Unity 调试程序——>选择对应的设备
再在运行的应用程序中点击ok
总结
使用Unity进行安卓真机调试,相对比较简单
只要保证以下几点即可
1. 能够正常发布 apk
2. 安卓手机开启了 开发者模式 并启动了USB调试功能
3. 正确的进行相关Build Settings的设置
4. 断点调试时,先让VS关联设备
Unity Remote
知识点一 Unity Remote是什么?
Remote翻译过来是远程的意思
Unity Remote是Unity提供给我们的一个可以安装到移动平台上的应用程序
帮助我们进行调试的远程工具
该应用程序可以安装到 Android、IOS设备上
当我们在Unity编辑器运行项目时,移动设备上安装的Unity Remote会和Unity连接
Unity编辑器中的游戏画面会被发送到移动设备上
移动设备上的输入操作会返回到Unity编辑器运行的项目中
它的主要作用就是可以让我们省去发布安装包、安装到移动设备上的这一繁琐流程
可以直接通过Unity Remote远程连接来达到以下目的:
1.查看项目在设备上的视觉表现效果
2.测试移动设备输入逻辑是否能正常使用
设备的以下输入会被回传到Unity引擎中用于测试
触屏输入相关
GPS
陀螺仪
指南针
加速度计
相机拍照信息
等等输入信息
注意:
1.Unity引擎传递给移动设备的画面较模糊,帧率较低,我们只能看看大致的表现效果
2.我们主要通过这种方式,来测试移动设备输入相关的功能
比如:陀螺仪、GPS、触屏功能等等
知识点二 获取和使用Unity Remote
1.下载Unity Remote应用程序,并安装到移动设备上(可在资料区获取)
2.将移动设备使用USB调试模式和电脑连接
3.在菜单栏Edit——>Project Setting——>Editor中设置Unity Remote的Device为任意设备
4.在移动设备运行Unity Remote
5.在Unity编辑器中启动项目,便可以进行远端调试
注意:
1.如果电脑插入多个Android设备,会自动选择第一台设备
2.Unity Remote存在的主要目的仅仅是为了快速的在设备上测试输入相关功能以及基本表现效果,本质上手机执行的只是投影,我们还是在电脑上进行允许的,而不是进行真机测试。如果要完整的测试,还是需要像我们之前那样发布安装进行调试
总结
Unity Remote主要可以帮助我们快速的测试设备的输入相关功能
Android Logcat——基础内容学习
知识点一 Android Logcat是什么?
Android Logcat是Unity提供的一个拓展包
引入该拓展包后,我们可以在Unity当中对Android应用程序进行调试
我们可以通过该工具获取到:
1.安卓日志打印信息
2.安卓应用程序内存统计
3.安卓屏幕截图
4.安卓屏幕录像
5.堆栈跟踪
Unity2019.4及以上版本都可以引入Android Logcat来帮助我们进行调试
和前前一节我们提到的Unity自带的 剖析器(Profiler窗口) 存在类似。
但是Android Logcat依然拥有性能检测功能,虽然这可能不如Unity Profiler提供的内存分析功能那么深入和详细。
而且还多出了系统消息监控等一系列的功能。
知识点二 如何使用Android Logcat工具
1.在Unity工程中引入Android Logcat包
2.连接Android设备
3.将Android Logcat连接到Android设备上点的应用程序,便可以查看相关信息
思维导图
总结
Android Logcat工具可以帮助我们进行Android相关调试
我们可以通过查看相关打印信息,来排查问题
Android Logcat——屏幕捕获工具
知识点一 屏幕捕获工具的作用
屏幕捕获工具主要可以帮助我们进行游戏内截图,录屏
该工具可以帮助我们:
测试人员用来录制bug表现,反馈给程序人员进行解决
获取截屏、录屏信息,获取宣传资料
优点:直接PC端远程获取,方便快捷,便于记录bug表现效果
缺点:录制的视频不会捕获声音,录屏功能可以部分设备不支持
思维导图
总结
屏幕捕获工具主要是提供给测试人员使用
他们在真机上测试项目时,可以通过该工具进行截图或录屏
将遇到的bug反馈给程序员方便排查解决bug
Android Logcat——堆栈跟踪实用工具和日志解析
知识点一 堆栈跟踪实用工具的作用
目前我们使用Android Logcat连接真机进行测试时
打印、警告、报错等等信息都会直接在主窗口中打印出来让我们进行分析
相当于它帮助我们进行了自动的堆栈跟踪解析
什么是自动堆栈跟踪解析呢?
就是我们可以在打印窗口看到具体是哪个脚本的哪行代码
出现了打印、警告、报错等等信息
而Tools(工具)中的Stacktrace Utility(堆栈跟踪实用工具)的作用是
允许我们复制粘贴自定义日志并解析堆栈跟踪
主要用于没有真机连接设备调试时
或者之后正式发布版本后
我们可以获取应用程序日志信息
将这些日志信息复制到该工具中用于翻译
(一般项目会在崩溃后,在本地存储一份崩溃日志,我们可以获取该日志)
因为这种情况下的日志信息中,不会明确指明是哪个脚本哪行代码
往往是一堆看不懂的符号,我们可以使用该工具进行翻译
比如:下面这个打印信息就是安卓的原始日志
E CRASH : #01 pc 01c65330 /data/app/com.CrashComp.Crash-J2Z_L0XSsSAZPkt9lab2rQ==/lib/arm/libunity.so
(DiagnosticsUtils_Bindings::ForceCrash(DiagnosticsUtils_Bindings::ForcedCrashCategory, ScriptingExceptionPtr*)+48)
这里面都是一堆特殊符号,并没有明确告诉你哪个脚本哪行代码
通过翻译后堆栈跟踪实用工具翻译后,我们就能够获取到哪个脚本哪行代码打印了输出了该信息
总而言之它该工具就是用来翻译发布后安卓应用程序的日志信息的
思维导图
总结
使用堆栈跟踪实用工具的作用是可以翻译自己获取到的安卓日志信息
使用流程是:
1.设置项目的 so 文件路径(和项目绑定,可以在打包的之后指定)
2.将日志信息复制到Original(初始)页签中
3.点击Resolve Stacktraces(解析堆栈跟踪)
4.在Resolved(已解析的日志)页签中查看翻译结果
注意:我们在电脑连接安卓设备通过Android Logcat进行调试时一般不使用该功能
只有当非连接调试时,获取了安卓崩溃日志后才会使用该功能
Android Logcat——内存窗口工具
知识点一 内存窗口工具的作用
在学习之前
首先了解 RAM(运行时内存)对于我们的意义
如果应用程序出现闪退情况
往往都是因为应用程序运行时内存的使用超出了设备允许的最大内存量,而被手机系统强行关闭
注意:
不同品牌、型号的手机配置都是不同的,手机后台运行的程序数量也是不同的
所以要根据实际情况进行测试获取目标设备的内存极限值
可以选取市面上的主流机型来进行测试
今天我们要学习的内存窗口工具
是用于跟踪应用程序RAM(运行时内存)的分配情况的
我们可以使用它来分析应用程序可能存在的内存问题
我们可以使用它 定期自动的 或者 手动的 捕获内存快照
这里的内存快照就是捕获的这一瞬间应用程序的运行时内存使用情况
根据内存快照我们可以分析内存问题
比如:
切换场景前和切换场景后的内存快照比较,判断是否存在内存泄露
比如闪退前的内存快照,来分析设备占用多少内存时造成了闪退,确定内存瓶颈等等
思维导图
总结
内存窗口工具可以帮助我们调试分析应用程序的内存问题
它是非常重要的调试工具
Android Logcat——ADB调试相关
知识点一 ADB是什么?
ADB是 Android Debug Brige(安卓调试桥)的简称
它是我们调试Android设备的一套指令集
它可以让我们通过指令在其他设备上来对安卓系统进行一些操作
比如:
关机、重启
安装、启动、卸载应用程序
删除、移动、复制文件
查看日志信息
我们最常使用的就是查看日志信息的功能
之前学习的Android Logcat工具其实就是利用了ADB来获取的信息
由于Android Logcat工具只能在Unity 2019.4及其以上版本才能使用
所以对于老版本的Unity来说,我们一般使用ADB来帮助我们进行调试
注意:
使用ADB工具的前提是 电脑和安卓设备处于USB调试连接
知识点二 如何使用ADB?
在Android SDK的路径中
寻找platform-tools文件夹
在其中可以找到adb.exe文件
我们需要配合命令调试符窗口(Windows)使用adb指令集
方法一:
直接在Android Logcat窗口中使用Tools中的Open Terminal(打开终端)
Window系统会自动打开命令调试符窗口
MacOS系统会自动打开终端窗口
会直接来到SDK文件夹中的platform-tools(平台工具)文件夹
在后面直接输入指令即可
adb 指令
方法二:
自己打开命令调试符窗口
输入adb.exe所在文件夹路径
比如:
D:\Android\android-sdk\platform-tools\adb 指令
知识点三 对于我们来说的关键指令
常用指令
1.显示日志信息
adb logcat
2.获取Unity相关日志信息
adb logcat -s Unity
做了解的指令
1.查看abb相关信息,比如版本号、常用命令等
adb help
2.查看adb版本
adb version
3.安装apk
adb install apk路径
4.覆盖安装
adb install -r apk路径
5.卸载应用程序
adb uninstall 应用程序包名
6.保留数据卸载应用程序
adb uninstall -k 应用程序包名
7.查看连接的主机设备
adb devices
8.从电脑上复制文件到手机
adb push 电脑上文件路径 需要复制到的手机路径
9.从手机上复制文件到电脑
adb pull 手机上文件路径 需要复制到的电脑路径
10.查看手机上安装的所有应用程序包名
adb shell pm list packages
11.截图
adb shell screencap 保存到的手机路径
12.录屏
adb shell screenrecord 保存到的手机路径
等等
更多信息
https://developer.android.com/studio/command-line/adb.html
总结
Android Logcat其实就是对ADB的封装
利用了ADB提供给我们用于调试的指令集做了很多功能
对于Unity2019.4及其以上版本,我们使用Android Logcat即可
对于低版本,我们需要直接使用ADB指令集来进行调试
我们经常会使用到的功能就是日志信息获取
可以让我们获取Unity中的打印信息,报错信息等
帮助我们排查bug
AndroidStudio 内调试安卓应用程序
知识点一 回顾Unity导出Android Studio工程
Build Settings中进行设置
勾选Export Project
勾选Development Build
导出到指定目录
使用Android Studio打开该工程
更新Gradle版本
删除 android.enableR8
保证构建成功
知识点二 在Android Studio中调试应用程序
保证Android设备和电脑进行USB调试连接
菜单栏的Run页签中进行调试(若上部分Run置灰,可以重启一次Android Studio)
在下方的Logcat日志窗口和Profiler性能分析器窗口调试应用程序,排查问题
更多关于Android Studio调试和性能分析内容
调试:https://developer.android.google.cn/studio/debug
性能分析:https://developer.android.google.cn/studio/profile
有关性能调试的思维导图
总结
Android Studio中调试应用程序和
Unity中使用 Android Logcat + Unity Profiler窗口类似
一般情况下,没有特殊需求,我们都在Unity中进行Android应用程序调试
相对Android Studio中调试来说更适合我们Unity程序员
第5节: 进阶知识点——Java语法
此知识点被记录在我的另一篇文章中:
第6节: 进阶知识点——Kotlin语言(待补)
待补
第7节: Unity和Android交互
导入
本文Unity版本为2022.3.11f1c1,Andriod studio版本为2023.2.1,版本较新,所以一些操作会和网络上的老版本有差异,本文的全部操作已经经过本人的实验表明可行。
交互项目准备
准备知识 Unity和Android交互指什么?
Unity和Android之间的交互主要指
在发布安卓项目时,我们可以
1.在Unity相关代码中调用Android相关内容
2.在Android相关代码中调用Unity相关内容
要达到这样的目的,我们需要建立Android项目
将Android项目以jar包或aar包的形式导入Unity后进行交互,再一起打包
jar和aar包是什么?
他们都是归档文件
jar包:jar包 包含Android项目中的脚本文件和清单文件,不包含资源文件
jar包导入其他工程后,其他工程可以方便引用源码
aar包:aar包是AndroidStudio下打包Android工程中的src(脚本文件)、res(资源文件)、lib(库文件)后生成的打包文件,
aar包导入其他工程后,其他工程可以方便引用源码和资源文件
注意:用Android Studio打包时一般以aar包形式
用Eclipse打包时一般以jar包形式
简单记忆:
jar和aar有点类似C#中的dll文件,只是规则和结构不同
我们可以将这些包放到其他工程中使用
我们这节课的主要目的就是创建之后用于生成aar包的Android Studio的工程
用于之后处理Unity和Android的交互逻辑
第一步 创建Unity和Android Studio项目
1.创建Unity项目后,切换到Android平台,设置包名和Android版本
2.创建Android Studio
选择 Phone and Tablet,创建一个Empty Activity项目
注意:
1.老版本可以直接修改gradle修改APP为library文件,导致我们需要保证studio项目包名对应Unity项目包名,但是新版本通常采取直接new modle的方式添加library,这个时候可以重新指定包名,所以不再强调。
第二步 创建新的modle——library类型
1.右键app文件夹,选择Open module setting。
2.在setting中创建一个新的android library,注意包名必须和Unity项目包名对应。
3.将app原来的MainActivity文件移到新建的library目录内相同的位置下面,因为新建的library没有自带这个脚本。
4.将app原来的AndroidManifest文件移到新建的library目录内相同的位置下的文件进行代码替换,主要需要把application中的activity移动过来,因为新建的library的activity是没有什么内容的。
最后在移动过来的AndroidManifest中加入一句 <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
通常结果如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="Unity包名">
<application>
<activity
android:name="Unity包名.MainActivity" <!--注意虽然默认这里只有.MainActivity,但是这里必须写全,否则可能导致安装出现两个图标-->
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
</activity>
</application>
</manifest>
5.只保留创建的module,移除原来的app,这样项目的主moudle就切换为了新建的library,原来的app文件夹可以直接删除。
6.在androi界面(左上角切换界面),删除工程中两个Test项目以及res下的无用资源(两个测试文件需要删除两次,res可能某种情况删除会报错,不是极限追求压缩可以保留)
第三步 导入 classes.jar 包
路径:Unity安装目录\Data\PlaybackEngines\AndroidPlayer\Variations\mono(il2cpp)\Release\Classes中。
1.将包拷贝到AndroidStudio中的app\libs下
2.导入后 选择包 右键点击 Add As Library
第四步 导入 UnityPlayerActivity 脚本
路径:Unity安装目录/Data/PlaybackEngines/AndroidPlayer/Source/....
将路径下的文件夹拷贝到AndroidStudio中的 src/main/java/com/Unity3d/player,其中unity3D/player文件夹需要自己创建。
第五步 修改MainActivity脚本
我们需要修改Android Studio中的MainActivity脚本
1.改为继承UnityPlayerActivity
2.注释onCreate函数中的setContentView代码
3.添加自定义函数或者变量之后用于测试
第六步 生成Untiy用的aar包
选中MainActivity脚本
选择 工具栏——>Build——>Make Moudle .....
随后会新建一个build目录,在里面的outputs的arr文件夹下获取arr包。
如果打包aar包时 出现了 下载相关内容的 字样 那么就需要多等待一会儿,下载完成过后 一般就能够构建成功
详细图文教程
Unity与安卓交互 之 ✨ 在Android Studio中写代码导出aar包,在Unity中使用交互(小白完整篇)_呆呆敲代码的小Y的技术博客_51CTO博客
Unity 与Android交互-调用 Android 打包 SDK - 知乎 (zhihu.com)
android aar怎么给unity使用 unity aar包_mob64ca140ce312的技术博客_51CTO博客
总结
本节课制作的aar包,是用于和Unity进行交互的安卓包
下节课我们把此包并入Unity,就可以在Unity对我们在studio的MainActivity里面写好的安卓变量和方法进行调用。
操作的步骤不能有误,否则会影响之后的交互功能制作
Unity中调用Android内容
准备工作
在AndroidStudio中的MainActivity中加入测试用的成员变量
知识点一 导入AndroidStudio生成的内容
在Unity中新建 Plugins/Android 插件文件夹
将AndroidStudio生成的内容 放入该文件夹中
导入aar包
导入AndroidManifest.xml配置文件。
在2019以上unity,AndroidManifest配置文件有3种来源。
直接复制之前studio项目里面的AndroidManifest
获取arr包里面自带的AndroidManifest,这份AndroidManifest通常就是stuido项目里面的AndroidManifest加上了一些新的代码。
在Unity,building setting->player Settings->Publishing Setting中勾选Custom Main Manifest,会自动帮我们在文件夹里生成AndroidManifest,但是需要注意的是,里面的包名需要我们主动填写
这里博主建议用后两种方法,通常出问题的概率比较低。
arr包的AndroidManifest和Unity里的AndroidManifest
两个AndroidManifest文件的功能实际上有所不同:
AAR 的 AndroidManifest.xml
AAR 包通常是库模块,可能是你自己的库或第三方库。AAR 的 AndroidManifest.xml 主要包含:
必要的权限:AAR 包需要的权限,如网络访问、写入外部存储等。
组件声明:定义活动(Activities)、服务(Services)、内容提供者(Content Providers)和广播接收者(Broadcast Receivers)等。
应用配置:特定的配置,如 android:theme、android:hardwareAccelerated 等。
AAR 的 AndroidManifest.xml 文件通常不指定应用级的入口点(如 LAUNCHER 活动),而是提供该库所需的组件和权限。
Unity 项目的 AndroidManifest.xml
Unity 项目的 AndroidManifest.xml 更多地关注整个应用的配置,通常包括:
应用包名:定义整个应用的唯一标识符。
应用权限:整个应用所需的权限,这可能包括 Unity 引擎运行所需的权限及游戏特定的权限。
主活动:定义应用的主入口点,通常是 UnityPlayerActivity,这是 Unity 游戏启动的主活动。
Intent 过滤器:用于定义如何启动应用的规则,通常包括一个声明应用为 LAUNCHER 的意图过滤器。
Unity 的 AndroidManifest.xml 是在最终 APK 构建过程中用作主 Manifest 的基础,所有从 AAR 包和其他库导入的 Manifest 信息都会根据需要自动与其合并,当然,前提是之前的设置正确。
知识点二 在Unity中书写交互代码
固定写法
创建和Android通信的类信息
using (AndroidJavaClass ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
//获取当前Unity基于的Activity对象
//这里得到的对象就相当于是aar包中的MainActivity
using (AndroidJavaObject ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity"))
{
//获取到MainActivity后 就可以调用其中的对应Java代码了
//变量相关
//1.成员变量的获取和设置
//ajo.Get<变量类型>("变量名")
//ajo.Set<变量类型>("变量名", 值)
//2.静态成员变量的获取和设置
//ajo.GetStatic<变量类型>("变量名")
//ajo.SetStatic<变量类型>("变量名", 值)
//函数相关
//1.成员函数调用
//无返回值
//ajo.Call("函数名", 参数)
//有返回值
//ajo.Call<返回值类型>("函数名", 参数)
//2.静态成员函数调用
//无返回值
//ajo.CallStatic("函数名", 参数)
//有返回值
//ajo.CallStatic<返回值类型>("函数名", 参数)
}
}
注意
此代码在Unity直接运行的时候是会报错的,需要在实机才能正常使用。
知识点三 打包注意事项
基础设置:
打包密钥设置
要求非中文路径
aar包设置(根据打包报错提示来处理,一般由以下几步需要处理):
删除aar包中 libs下的classes.jar,因为Unity会自带,避免重复报错
删除aar包中 classes.jar 中的 UnityPlayerActivity.class,因为Unity会自带,避免重复报错
删除aar包中 classes.jar 中的 BuildConfig.class,通过Unity打包不需要构建配置(新版可能没有,那就不用管)
知识点四 安装测试
打包apk
然后在真机或者虚拟机上安装打包的应用进行交互测试
总结
Unity调用Android代码需要注意
固定的API写法
打包报错处理
Android中调用Unity内容
知识点一 能被Android调用的Unity函数规则
想要被Android端调用的Unity函数
1.需要写在继承MonoBehaviour的脚本中
2.需要挂载在场景中处于激活状态的GameObject上
交互时,在Android端调用API:
UnityPlayer.UnitySendMessage("对象名", "函数名", "参数信息")
注意:该API中的参数只能是String类型或者为null
随后安卓端打包出arr,供untiy调用。
知识点二 交互流程
在Unity端创建测试脚本,编写测试函数
在场景上创建一个空物体,将脚本挂载上去
在Android端书写测试代码
重新打包aar包,导入Unity中进行打包测试
在Unity中调用有关安卓函数,此安卓函数间接调用Unity里面的测试函数,流程跑通。
总结
Android调用Unity相对比较简单
在Android端使用 UnityPlayer.UnitySendMessage API,打包成arr包供Unity调用即可。
Android开发的必备原理
知识点一 Android应用程序的基本构成
1.Android SDK
提供了用于开发Android应用程序的各种API和工具
2.编程语言
使用Java或者Kotlin语言进行开发,他们提供了丰富的库和API
3.XML配置文件
Android应用程序使用XML来定义UI布局、样式和资源信息等
4.应用程序组件
Android应用程序有四种组件组成:
4-1:Activity(活动)
主要用于实现用户界面,代表一个屏幕或窗口,包含了各种UI组件,按钮,文本,输入框等等
4-2:Service(服务)
是一种可以在后台执行长时间运行操作的组件,没有用户界面,一般用于处理和交互无关的逻辑
比如:上传、下载、音乐播放等
4-3:Broadcast Receiver(广播接收器)
主要用于接受系统或者其他应用程序发出的广播消息
消息可以来自系统事件(比如网络连接变化、设备启动等),也可以来自其它应用程序
4-4:Content Provider(内容提供程序)
用于管理应用程序数据,可以让其它应用程序或系统访问本应用中的数据,也可以让本应用访问其它应用或系统的数据
比如用于存储应用程序数据,图片、音频、视频等
等等
在开发Android应用程序时,其实主要就是在编写基于这四种组件的逻辑
日常开发时,更多的就是在利用Android SDK中的API 开发Activity活动组件(类似游戏中UI界面逻辑开发)
如果有其他后台或者拓展功能,才会使用其它3种组件
知识点二 AndroidManifest.xml文件的作用
它是Android应用程序的应用清单文件
每个应用程序都必须包含一个,并且文件名必须是AndroidManifest.xml
该文件中包含了应用程序的配置信息,Android系统会根据该配置来运行应用程序
该文件中包含的重要信息有:
应用程序包含的四大组件的内容(Activity,Service,Broadcast Receiver,Content Provider)
应用程序的权限(存储权限、互联网访问权限等等)
应用程序元数据(程序名称、版本号、图标、包名等等)
应用程序启动信息(默认启动哪一个Activity)
常用标签作用:
manifest标签:主要包含包名、版本号等等
uses-permission标签:应用程序权限
application标签:应用程序各组件包含在其中,还可以配置一些图标、文本、样式等等信息
activity标签:Activity组件的具体信息
meta-data标签:为Activity提供元数据,可以通过API获取该数据
intent-filter标签:为组件声明意图(intent),其中还包含action(意图类型)和category(意图类别)两个子标签
等等
知识点三 了解这些对于我们的意义
了解了Android开发的这些基本原理信息后
之后在学习相互内嵌式,我们就能明白我们在做什么
Unity程序在打包到Android平台后,其实就是作为一个Activity存在的
之后我们在和Android相互嵌入式,我们只需要把Unity作为一个Activity单位来处理即可
Unity中嵌入Android内容
知识点一 Unity中嵌入Android内容指什么
从上节课中我们知道
在Android开发中Activity(活动)就是我们看到的一个界面(屏幕)
那么所谓的Unity中嵌入Android内容就是通过Unity打开Android中制作好的Activity
让Unity可以和Android中制作的功能进行交互
注意:学习这部分知识我们只学习Unity如何开启Android中的Activity
具体的安卓开发相关需要自行学习安卓相关知识,不属于本课程范围内
知识点二 Activity创建
在Android项目中新建一个Activity并生成aar包
1.打开我们之前学习Unity和Android交互中建立的Android工程
2.在com.tarkr.mytestgame上点击右键,新建一个空的Activity
3.检查AnadroidManifest.xml中是否多出了对应的Activity配置
4.在MainActivity中添加函数,用于打开新建的Activity
5.生成aar包
知识点三 Unity中进行交互处理
将aar包导入Unity后进行相关设置后导出包
1.按照之前讲解的知识点,删除aar包中需要删除的内容
2.书写对应交互逻辑,用于测试打开Android中的Activity
3.在Unity中导出包,用Android Studio打开
注意:如果要实现内嵌Android Activity,我们需要在Unity中导出安卓工程包(打包的时候记得勾选Export project)后使用Android Studio进行加载然后二次打包
主要原因是,Unity中无法下载关联的相关包,会导致打包出去的内容报错
知识点四 使用Android Studio打包
使用AndroidStudio打开我们通过Unity生成的Android包
利用我们之前学习的Android Studio打包的相关知识,进行构建,打包
根据报错,来针对性的进行修改和配置
可能出现的报错:
1.打包出去后,运行后闪退,找不到对应类。
解决方案:引用缺失的包,重新打包
2.安装后出现两个图标。
解决方案:修改AnadroidManifest.xml配置文件,移除LAUNCHER相关配置。但是新版的unity导入后似乎已经默认不会发生这类事情。
3.界面xml报错。
解决方案:需要修改构建配置文件 加一个对应的引用 然后还需要在属性配置当中允许使用 Androidx
4.如果出现了Appcompat报错。解决方案:
3-1.修改配置文件 加一个android:theme = "@style/Theme.AppCompat.Dialog"
3-2.让我们新建的Activity直接继承Activity
等等(根据具体报错内容,查询资料进行解决)
总结
Unity中嵌入Android内容的关键点就是
我们需要进行两次“打包”
即打包时,我们需要在Unity中打包出安卓工程包后
再使用Android Studio进行打包
根据各种报错信息来一步步的解决问题
缺少什么就添加什么,配置有问题就修改配置
如果以后有需求需要嵌入安卓相关内容,那么需要系统的学习一些安卓开发的相关知识
可以购买一些安卓开发相关书籍来学习
Android中嵌入Unity内容
知识点一 Android中嵌入Unity内容指什么
在进行Android开发时,可能会有需求显示Unity开发的3D内容
一开始我们启动的是Android应用程序中的Activity
通过Activity我们想要打开Unity开发的内容进行展示
这就是Android中嵌入Unity内容的意思
注意:Android中嵌入Unity存在限制问题,退出Unity所在的Activity会退出整个App
所以如果存在Android和Unity混合开发的情况,建议采用上节课的Unity中嵌入Android的方式
所以本节课内容主要做为拓展知识
知识点二 新建Unity测试项目
在该项目中添加一些测试内容,比如方块旋转
将该项目通过勾选Export Project,打包为Android工程
知识点三 新建Android测试项目
新建一个Android工程
将知识点二中导出内容中的 unityLibrary 文件夹拷贝到Android工程中
将知识点二中导出内容中的 launcher 文件夹中的res中的内容拷贝到unityLibrary文件夹中合并
修改安卓工程中的 settings.gradle 文件,在最后添加 include ‘:unityLibrary’ 并 点击右上角同步
修改安卓工程中的 gradle.properties 文件,在最后添加 unityStreamingAssets=.unity3d, google-services-desktop.json, google-services.json, GoogleService-Info.plist 并再次同步
修改安卓工程中 app 文件夹中的 build.gradle 文件,在依赖项中 添加 implementation project(':unityLibrary')
在主Activity中添加一个用于跳转的按钮,并为该按钮添加监听事件,用于打开Unity的Activity
修改两个 AndroidManifest.xml 文件,让主Activity的作为主Activity,删除Unity相关Activity的设置
知识点四 打包测试
设置密钥,进行打包
用模拟器进行测试
总结
当我们要进行Android和Unity混合开发时
建议大家采用上节课的Unity中嵌入Android内容
主要原因是,Android中嵌入Unity内容限制较大,当我们切换到Unity的Activity后
如果想要关闭当前Unity Activity返回之前的,会让整个App退出,不能达到我们想要的需求
第8节: Android SDK接入(以百度定位SDK为例)
SDK是什么
知识点一 什么是SDK?
SDK是Software Development Kit(软件开发包)的简写
一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合
说人话:
SDK就是程序员针对某些操作系统(比如Windows、Android、IOS)写好的代码,这些代码用于完成某些功能逻辑
操作系统的不同,那么对应的开发语言也就不同,比如Android平台可能是基于Java写的,IOS平台可能是基于Objective-C写的等等
知识点二 为什么要接入SDK?
很多游戏或软件的第三方功能都是第三方平台提供的
我们想要在产品中使用这些功能,就需要接入这些第三方的SDK
比如游戏内的 支付宝支付功能、微信支付功能、各平台登录功能、数据统计功能等等
举例:
我们制作的游戏找到了代理商 为腾讯,腾讯要求能够支持QQ号登录、微信登录
这时我们就需要接入 腾讯提供的 平台登录SDK,让我们的游戏能够具备这样的功能
知识点三 应该如何学习接入SDK
需要掌握Unity和Android交互相关知识点(重点:相互调用)
需要详细阅读第三方SDK提供的开发文档(重点:相关API调用、应用配置、权限配置等)
集成SDK后,一般情况下,为了发布顺利,建议最后使用Android Studio进行打包(重点:避免相关依赖项不能正确加载)
总结
通过以上知识点的讲解
大家对SDK有一个基本的认识了
应该也能意识到,SDK接入这个工作内容,一般都会放在项目的中后期来完成
一般都是整体项目基本完成,最终要上线测试前进行接入
这部分知识点也是相对较为重要的
可以提升我们的就业竞争力
交互项目创建和接入ADK
交互项目创建
由于我们要在Android平台集成第三方的SDK
因此自然联想到,我们需要Unity和Android之间进行交互
需要在Unity端调用Android端开发好的东西
所以我们需要创建交互项目
之后就在Android交互项目中引入第三方SDK进行逻辑开发
注意:我们通常会把第三方提供的sdk在studio项目中打包成arr,然后供Unity使用。
其实可以认为SDK导入Unity的步骤,基本就是我们第7大节里面前四节里面用到的知识点。
因此,本节课所有操作过程均为上文中Unity和Android交互——交互项目创建中内容
所以下文不再提及,我们只需要按之前课程操作即可。
接入ADK
1.阅读官方接入文档
1-1:合作方提供
1-2:官方网站获取
2.按照接入文档中内容进行操作
2-1:依赖配置、权限配置等
2-2:API使用说明
3.接入过程中,根据报错解决问题
注意:
若第三方提供针对Unity的SDK直接使用即可,一般不需要创建交互项目
若没有提供,一般都是针对Android和IOS单独的支持,需要创建交互项目,即执行上文打包arr操作。
文档:Android定位SDK | 百度地图API SDK (baidu.com)
SDK接入完毕后,我们就可以进行API的编写,API的编写也被记录在上文文档当中。
随后我们打包arr,将arr接入Unity,即可打包APK。
打包测试
尽管理想来说我们将arr接入Unity后Unity打包的APK就已经可以正常调用百度地图的API,但是这里依然建议真正打包项目的时候,还是需要将Unity项目再次打包回Studio再进行真正的打包,有两个好处。
如果有什么缺失的包信息和打包BUG,studio可以直接帮我们方便的下载,并且提示更加直观。
规避大部分由于缺少安卓的引用产生的bug,毕竟studio基于安卓端,而我们的项目也跑在安卓端上。
通过Studio打包后APK即可在真机上实际的运行和调用SDK有关功能。
Android端总结
思维导图
应该达到的水平
需要熟练掌握:
将Unity开发的内容进行Android打包
能够进行Android端调试
能够按照套路接入各种SDK