关于Unity与安卓混合开发

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提供了AndroidJavaClassAndroidJavaObject代表Java的对象

使用AndroidStudio创建类库,来为C#提供对应的Java类,而不是以独立项目运行。

注意这里如果你创建的是独立项目需要将bulid.gradle下的pluginsid更改为com.android.library
并且将android下的打包信息删除,如defaultConfigbulidTypescompileOptions都删除。

写好Java代码后,构建该类库,导出arr程序集,将Jar包放入Unity中来使用。

调用Jar包

  1. 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);
  1. AndroidJavaObject

通过AndroidJavaObject类,AndroidJavaObject - Unity 脚本 API

1
var javaObject = AndroidJavaObject(className,args);
Name Des Params
Call 对对象(非静态)调用 Java 方法。
Get 获取对象(非静态)中的字段值。
Set 设置对象(非静态)中的字段值。

AndroidJavaClassAndroidJavaObject的区别

AndroidJavaClassAndroidJavaObject 都是 Unity 中用于与 Android 原生代码进行交互的类,但它们有不同的作用和用法。

  1. AndroidJavaClass

    • AndroidJavaClass 用于表示一个 Java 类,可以通过它来调用 Java 类的静态方法和静态属性,以及创建 Java 类的实例。
    • 通常情况下,当你需要调用一个不需要实例的静态方法时,可以使用 AndroidJavaClass
    • 通过 AndroidJavaClass,你可以访问 Android SDK 中的系统类或自定义的 Java 类。
  2. 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。