调用场景与准备工作
Unity作为跨平台开发引擎,虽能实现多端部署,但在访问Android原生功能(如硬件传感器、系统服务、第三方SDK集成)时,仍需调用Java代码,实现这一交互的核心是通过Unity的AndroidJavaClass与AndroidJavaObject接口,结合Android原生插件开发。
准备工作包括:
- 环境配置:安装Unity(建议2021.3+版本,兼容性更好)、Android Studio(用于开发Android插件)、Android SDK(API版本需与Unity目标平台匹配,如Android 10对应API 29)。
- 项目创建:在Unity中新建3D项目,进入“File > Build Settings”,切换Android平台,安装“Android Build Support”模块;在Android Studio中创建“Android Library”模块(作为Unity插件载体)。
Android插件开发步骤
Android插件是连接Unity与Java代码的桥梁,本质是一个包含Java/Kotlin代码的.aar或.jar文件。
创建Android模块
在Android Studio中,选择“File > New > New Module”,勾选“Android Library”,命名为“UnityPlugin”,模块包名建议与Unity包名一致(如com.unity.example),避免类加载冲突。
编写Java代码
在UnityPlugin/src/main/java/com/unity/example目录下创建Java类,例如NativeUtils.java,实现需要的功能(如获取设备信息、调用系统服务):
package com.unity.example;
public class NativeUtils {
// 静态方法:Unity可直接调用
public static String getDeviceModel() {
return android.os.Build.MODEL;
}
// 实例方法:需先创建对象再调用
public void showToast(android.content.Context context, String message) {
android.widget.Toast.makeText(context, message, android.widget.Toast.LENGTH_SHORT).show();
}
}
配置AndroidManifest.xml
若需权限(如相机、网络),在UnityPlugin/src/main/AndroidManifest.xml中声明:
<uses-permission android:name="android.permission.INTERNET" />
构建插件
点击Android Studio顶部“Build > Build Bundle(s) / APK(s) > Build Bundle(s)”,生成UnityPlugin.aar文件,位于UnityPlugin/build/outputs/aar/目录。
Unity端调用Java代码的实现
将生成的.aar文件导入Unity项目:在Unity的Assets目录下创建“Plugins/Android”文件夹,将UnityPlugin.aar拖入其中,随后通过代码调用Java功能。
调用静态方法
静态方法无需实例化对象,可直接通过AndroidJavaClass调用:
using UnityEngine;
public class CallJavaStatic : MonoBehaviour {
void Start() {
// 获取Java类(包名+类名)
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity.player.UnityPlayer");
AndroidJavaClass nativeUtils = new AndroidJavaClass("com.unity.example.NativeUtils");
// 调用静态方法
string deviceModel = nativeUtils.CallStatic<string>("getDeviceModel");
Debug.Log("设备型号: " + deviceModel);
}
}
调用实例方法
实例方法需先创建AndroidJavaObject对象,再调用方法:
using UnityEngine;
public class CallJavaInstance : MonoBehaviour {
void Start() {
// 获取Android上下文(UnityActivity)
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity.player.UnityPlayer");
AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
// 创建NativeUtils实例
AndroidJavaObject nativeUtils = new AndroidJavaObject("com.unity.example.NativeUtils");
// 调用实例方法(传入上下文参数)
nativeUtils.Call("showToast", context, "Hello from Unity!");
}
}
Java回调Unity方法
若需Java代码主动向Unity传递数据(如异步操作结果),可通过UnityPlayer.UnitySendMessage实现。
Unity端定义接收方法
在C#脚本中声明一个public方法,用于接收Java回调:
using UnityEngine;
public class UnityCallbackReceiver : MonoBehaviour {
// Java端将调用此方法(需为public)
public void OnJavaCallback(string message) {
Debug.Log("Java回调: " + message);
}
}
Java端调用Unity方法
在Java代码中,通过UnityPlayer获取当前Unity实例,调用UnitySendMessage:
// 在NativeUtils.java中添加回调方法
public void callUnity() {
// 参数:Unity对象名、方法名、参数
UnityPlayer.UnitySendMessage("UnityCallbackReceiver", "OnJavaCallback", "Data from Java");
}
随后在Unity端调用callUnity方法,即可触发C#中的OnJavaCallback。
常见问题与解决方案
- 类找不到异常:确保Java类的包名与Unity中
AndroidJavaClass的字符串参数完全一致,且.aar文件已正确导入Plugins/Android。 - 上下文(Context)获取失败:调用Android系统服务(如Toast、传感器)需传入Context,通过
UnityPlayer.currentActivity获取当前Activity实例。 - 数据类型不匹配:Java与C#数据类型需对应(如Java的
int对应C#的int,String对应string),避免使用复杂对象(如自定义类),可通过JSON序列化传递复杂数据。 - 多线程问题:Java回调Unity方法需在主线程执行,若在子线程调用,需通过
Handler切换到主线程。
Unity调用Java代码的核心流程可概括为:开发Android插件(编写Java代码、配置权限、构建.aar)→ 导入Unity项目→ 通过AndroidJavaClass/AndroidJavaObject调用方法→ 处理回调与数据交互,掌握这一技术,可有效扩展Unity在Android平台的功能,实现复杂原生功能集成,开发时需注意包名一致性、上下文传递及线程安全,确保交互稳定可靠。

















