unity android交互

本文详细介绍了如何在Unity中通过AAR包与Android进行交互,包括数据映射规则、Androidapi类的实现、jar包引用、AndroidManifest.xml配置,以及C#脚本调用接口的步骤。遇到的问题和解决方案也一并分享,适合Android与Unity开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客:
Unity与android互调用
Unity打包Android最全攻略(含完整流程及常见问题)
Unity3d接入安卓aar详细过程
Unity端使用aar包的多种方式

首先在交互的时候我们首选需要搞清楚android和unity的基本数据的映射关系:

Java 类型C# 类型
基本类型,比如 int, boolean对应的值类型 int, bool
Stringstring
数组类型数组类型 (不能是多维数组)
其他继承自 Object 的类型AndroidJavaObject

所以在提供的接口的时候,一定要遵循上面的规则,否则会调用失败。

下面以不继承UnityPlayerActivity的方式实现aar

在这里插入图片描述
新建包名为:**com.stdemo.stsdk**添加对外的类:Androidapi

package com.stdemo.stsdk;

import com.unity3d.player.UnityPlayer;

public class Androidapi {
    private static String TAG = "Androidapi";

    private Activity _activity;
    private static Androidapi _instance;

    public static Androidapi instance(){
        if (_instance == null){
        	//UnityPlayer.currentActivity表示当前正在显示的Unity Activity
        	//作为context使用,例如toast函数。
            _instance = new Androidapi(UnityPlayer.currentActivity);
        }
        return _instance;
    }

    public Androidapi(Activity activity){
        _activity = activity;
    }
    
	public void toast(String msg){
        Log.i(TAG,"toast:" + msg);
        Toast.makeText(_activity,msg,Toast.LENGTH_SHORT).show();
    }

    public void st_debug(String msg){
        Log.i(TAG,msg);
    }
}

由于这里引入了UnityPlayer.currentActivity,所以我们需要引入unity的jar。

安装目录\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar

安装目录\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player\UnityPlayerActivity.java

将该文件copy到工程目录下的lib目录,并且重命名为:unity.jar
在这里插入图片描述

//build.gradle引入jar
compileOnly files('libs\\unity.jar')

此时重新生成项目,将项目生成的aarAndroidManifest.xml(根据实际可选)拷贝到unity工程的:Assets/Plugins/Android 目录下:
在这里插入图片描述
在这里插入图片描述

注意:如果拷贝了AndroidManifest.xml一定要修改Application的启动项为UnityPlayerActivity或者其子类,否则因缺少启动项,app启动失败

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

	<application>
		<activity android:name="com.unity3d.player.UnityPlayerActivity">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>


</manifest>

为什么说AndroidManifest.xml是可选的?因为如果不涉及权限,Activity以及用户自定义的meta数据的话,那么AndroidManifest.xml对于lib来说是空的,可以忽略,此时就可以不拷贝AndroidManifest.xml。

此时就可以在C#脚本里面调用对应的接口了。

//获取com.stdemo.stsdk.Androidapi 类
AndroidJavaClass sensorsDataAPIClass = new AndroidJavaClass("com.stdemo.stsdk.Androidapi");
//调用类的静态函数
AndroidJavaObject apiInstance = sensorsDataAPIClass.CallStatic<AndroidJavaObject>("instance");
//调用类的成员函数
apiInstance.Call("st_debug", log);

C#脚本接口说明
获取java某个类或者类的实例

//eg:完整的类名com.stdemo.stsdk.Androidapi
AndroidJavaClass xxxClass = new AndroidJavaClass("完整的类名");

//获取某个类的实例对象
AndroidJavaObject xxxObj= new AndroidJavaObject("完整的类名");

调用某个类的静态函数

xxxClass.CallStatic<返回值类型>("函数名",agr0,arg1,....argN)

调用某个类的成员函数

//在获取了某个类的实例的情况下
xxClassInstance.Call<返回值类型>("函数名",agr0,arg1,....argN)
可能遇见的坑:
1.生成的apk无法运行?
方案一:AndroidManifest.xml文件配置不对,检查是否存启动项
方案二:如果使用Unity Build and Run安装的,那么请导出工程,使用Android studio 编译运行工程。

2.unity3d android导出项目编译Multiple dex files define Lcom/unity3d/player/UnityPlayerActivity 
解决方案:将lib的包名com.unity3d.player修改为:com.unity3d.players,右键->Refactor->Rename
参考博客:https://blog.youkuaiyun.com/weixin_30898109/article/details/95009467


在这里插入图片描述

### 如何在 Unity 中实现与 Android交互 #### 使用 UnityAndroid 接口进行交互Unity3D 开发中,可以通过 Unity 提供的 `AndroidJavaObject` 和 `AndroidJavaClass` 类来访问 Android 原生 API。这使得开发者可以在 Unity 中调用 Android 的功能模块,例如显示 Toast 消息、启动 Activity 或者操作其他 Android 组件。 以下是通过 Unity 调用 Android Toast 消息的一个简单示例: ```csharp using UnityEngine; public class AndroidInteraction : MonoBehaviour { public void ShowToast(string message) { if (Application.platform == RuntimePlatform.Android) { using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { var currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() => { var toastClass = new AndroidJavaClass("android.widget.Toast"); var toastObject = toastClass.CallStatic<AndroidJavaObject>( "makeText", currentActivity, message, toastClass.GetStatic<int>("LENGTH_SHORT") ); toastObject.Call("show"); })); } } } } ``` 此代码片段展示了如何利用 Unity 的 `AndroidJavaObject` 来获取当前活动 (`currentActivity`) 并在其线程上调用 Android 的 `Toast` 方法[^1]。 --- #### 启动 Android 自定义 Activity 除了简单的消息提示外,还可以通过 Unity 启动自定义的 Android Activity。这种情况下通常需要创建一个带有特定入口点的 Android 应用程序,并将其打包到 APK 文件中以便于集成。 以下是如何从 Unity 启动 Android Activity 的方法: 1. **准备 Android 工程** 在 Android Studio 中构建一个新的项目并导出其 AAR 文件或直接编译成 APK。 2. **配置 Unity 项目** 将生成的文件导入至 Unity Assets/Plugins/Android 下面作为依赖库加载。 3. **编写脚本以触发 Activity 加载** ```csharp using UnityEngine; using System.Collections; public class LaunchAndroidActivity : MonoBehaviour { private const string ACTIVITY_CLASS_NAME = "com.example.MyCustomActivity"; IEnumerator Start() { if (Application.platform != RuntimePlatform.Android) yield break; try { using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { var activityContext = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); using (var intent = new AndroidJavaObject("android.content.Intent")) { intent.Call<AndroidJavaObject>("setClassName", activityContext.Call<string>("getPackageName"), ACTIVITY_CLASS_NAME); activityContext.Call("startActivity", intent); } } } catch (System.Exception e) { Debug.LogError($"Failed to start custom Android activity: {e.Message}"); } } } ``` 这段代码演示了如何动态构造 Intent 对象并通过它激活指定名称的目标 Activity[^2]。 --- #### 更复杂的交互方式——双向通信 对于更复杂的应用需求来说,可能还需要支持数据交换以及事件回调等功能。此时可以考虑采用 JNI(Java Native Interface)技术或者借助插件工具简化流程。具体做法如下所示: - 定义接口类用于接收来自 C# 层的消息; - 实现该接口并将实例传递给 Java 部分处理逻辑; - 当有响应返回时再通知回 Unity 端更新界面状态或其他动作。 更多细节可参阅官方文档说明[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值