Reference
Unity 与 Android 、IOS (一) 打包与交互 视频3h57m
Unity3D 实用技巧 - 原生移动端与Unity混合开发之学习篇 - 技术专栏 - Unity官方开发者社区
环境配置
1.配置应用图标
2.配置启动动画
3.安装JDK、JRE
4.配置JAVA环境变量
5.在Unity的额外工具(Extend Tool)中配置JDK、JRE
6.下载android studio
7.下载安卓模拟器进行调试
8.将SDK复制到Unity中
使用AndroidStudio打包
1.将Unity项目导出为Android项目
2.使用AndroidStudio打包和签名
C#调用Java
unity提供了AndroidJavaClass
与AndroidJavaObject
代表Java的类与对象。
使用AndroidStudio创建类库,来为C#提供对应的Java类,而不是以独立项目运行。
注意这里如果你创建的是独立项目需要将
bulid.gradle
下的plugins
的id
更改为com.android.library
并且将android
下的打包信息删除,如defaultConfig
和bulidTypes
、compileOptions
都删除。
写好Java代码后,构建该类库,导出arr程序集,将Jar包放入Unity中来使用。
调用Jar包
- AndroidJavaClass
通过AndroidJavaClass
类,AndroidJavaClass - Unity 脚本 API
1 | var java = new AndroidJavaClass(类名); |
常用的方法:
Name | Des | Params |
---|---|---|
Call | 对对象(非静态)调用 Java 方法。 | (string methodName, params object[] args); |
Get | 获取对象(非静态)中的字段值。 | (string fieldName); |
Set | 设置对象(非静态)中的字段值。 | (string fieldName, FieldType val); |
- AndroidJavaObject
通过AndroidJavaObject
类,AndroidJavaObject - Unity 脚本 API
1 | var javaObject = AndroidJavaObject(className,args); |
Name | Des | Params |
---|---|---|
Call | 对对象(非静态)调用 Java 方法。 | |
Get | 获取对象(非静态)中的字段值。 | |
Set | 设置对象(非静态)中的字段值。 |
AndroidJavaClass和AndroidJavaObject的区别
AndroidJavaClass
和 AndroidJavaObject
都是 Unity 中用于与 Android 原生代码进行交互的类,但它们有不同的作用和用法。
AndroidJavaClass:
AndroidJavaClass
用于表示一个 Java 类,可以通过它来调用 Java 类的静态方法和静态属性,以及创建 Java 类的实例。- 通常情况下,当你需要调用一个不需要实例的静态方法时,可以使用
AndroidJavaClass
。 - 通过
AndroidJavaClass
,你可以访问 Android SDK 中的系统类或自定义的 Java 类。
AndroidJavaObject:
AndroidJavaObject
用于表示一个 Java 对象的实例,可以通过它来调用 Java 对象的实例方法和访问实例属性。- 当你需要与 Java 对象进行交互,调用它的方法或者获取/设置它的属性时,可以使用
AndroidJavaObject
。 - 通过
AndroidJavaObject
,你可以创建一个新的 Java 对象实例,也可以获取已经存在的 Java 对象的实例。
总结:
- 如果要调用一个 Java 类的静态方法或静态属性,使用
AndroidJavaClass
。 - 如果要调用一个 Java 对象的实例方法或实例属性,使用
AndroidJavaObject
。
JAVA 调用 C#
在Unity中找到下面文件夹的JAR包。
将JAR包放在对应Android工程的libs文件夹,再将JAR包添加进工程。
UnitySendMessage
Name | Des | Params |
---|---|---|
UnityPlayer::UnitySendMessage |
调用Unity方法 | (GameObjectName,MethodName,Params); |
1 | UnityPlayer.UnitySendMessage("Canvas","TestMethod","Hello Csharp"); |
打包文件中arr_main_jar
是我们写的JAVA代码,debug/libs
是我们依赖的文件,比如上面使用的Unity的JAR包,或者使用微信的SDK都在这里面。
安卓工程目录
Launcher/AndroidManifest
安卓包的配置文件
配置了安卓APK的名称、包名、图标等等。
unityLibary/AndroidManifest
配置了主要场景Activity,可以将Activity理解成一个Unity场景。
UnityPlayerActive
扩展 UnityPlayerActivity Java 代码 - Unity 手册 (unity3d.com)
该类中有Activty的生命周期函数,OnCreate OnPause ...
。
扩展 UnityPlayerActivity
时,可覆盖 String UnityPlayerActivity.updateUnityCommandLineArguments(String cmdLine)
以将启动参数传递给 Unity。
UnityPlayerActivity
会在启动期间调用此方法。它接受当前的命令行参数(这些参数可为 null 或为空),并返回新的命令行参数字符串以传递给 Unity。
或者继承UnityPlayerActivity
之后重写其生命周期,在接入SDK等需求时可以在其中添加代码。
UnityPlayer::CurentActivety
: 保存了当前的UnityPlayerActivity
。
权限问题
先要在AndroidManifest
配置权限。
使用UnityEngin::Android::Premission
获取权限,具体请看请求权限 - Unity 手册
Android.Permission - Unity 脚本 API
静态变量
Camera | 在请求权限或检查是否已授予摄像机使用权限时使用。 |
CoarseLocation | 在请求权限或检查是否已授予使用粗粒度用户位置的权限时使用。 |
ExternalStorageRead | 在请求权限或检查是否已授予从外部存储(如 SD 卡)读取的权限时使用。 |
ExternalStorageWrite | 在请求权限或检查是否已授予写入外部存储(如 SD 卡)的权限时使用。 |
FineLocation | 在请求权限或检查是否已授予使用高精度用户位置的权限时使用。 |
Microphone | 在请求权限或检查是否已授予麦克风使用权限时使用。 |
静态函数
HasUserAuthorizedPermission | 检查用户是否已授予对设备资源或需要授权的信息的访问权限。 |
RequestUserPermission | 请求用户授予对设备资源或需要授权的信息的访问权限。 |
RequestUserPermissions | 请求用户授予对设备资源或需要授权的信息的访问权限。 |
IOS真机调试
先安装UnityIOS支持插件。
还要Apple的设备,有点难绷,先看看呗。
C#调用Object-C
C#调用Object-C可以直接将.mm
文件放置到Unity项目中。
这个extend关键字是个什么鬼。
Object-C调用
UnitySendMessage
Name | Des | Params |
---|---|---|
UnityPlayer::UnitySendMessage |
调用Unity方法 | (GameObjectName,MethodName,Params); |
1 | UnityPlayer.UnitySendMessage("Canvas","TestMethod","Hello Csharp"); |
这几节课都太水了。
UnityAppController
与UnityPlayerActivity类似,有一些应用的生命周期lauchOptions OpenUrl
。
PBXProject
iOS.Xcode.PBXProject - Unity 脚本 API
在unity中配置xcode,通过此API在Xcode中添加库文件、设置证书 …。
PlistDocument
iOS.Xcode.PlistDocument - Unity 脚本 API (unity3d.com)
iOS.Xcode.PlistElementDict - Unity 脚本 API (unity3d.com)
在unity中配置xcode,通过此API在Xcode中配置权限 …。
PostProcessBuild
Callbacks.PostProcessBuildAttribute - Unity 脚本 API (unity3d.com)
配置该特性的方法在打包时会调用,配合上面两个API可以进行配置Xcode。