赞
踩
在Unity的项目开发过程中,总会遇到Unity提供的方法不足以支撑安卓平台的开发,这时候我们就需要引用安卓平台本身的一些方法或者SDK来帮助我们继续开发,那么Unity和安卓原生时怎么进行交互的呢,在这里我们做一下简单的极少。
此过程主要在Android Studio中完成。
1、创建一个Empty Activity,点击Next
2、根据自己需要设置对应的项目名称和最小SDK版本,项目名称不需要和Unity包名一样,最小SDK版本需要和Unity中设置的一样。
unity中设置最小SDK
1、删除两个无用的工程
2、修改build.gradle
3、点击sync now
4、加入Unity classes.jar
jar来源:unity工具安装目录下的\Editor\Data\PlaybackEngines\AndroidPlayer\Variations,此文件夹中有il2cpp和mono两个文件夹,根据unity的编译选择对应的文件夹下的\Release\Classes\下的classes.jar
例如:C:\Program Files\Unity\Hub\Editor\2019.4.31f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
unity编译方式
将jar包复制到android studio工程的libs文件夹下,并且添加为库(Add As Library)。
5、这个版本的classes.jar中不包含UnityPlayerActivity.java类,需要自己手动添加。
C:\Program Files\Unity\Hub\Editor\2019.4.31f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source
找到对应路径下的com文件夹,复制到java文件夹下。
6、修改MainActivity类,使其继承UnityPlayerActivity。
package com.aitu.unityandroidutils; import androidx.appcompat.app.AppCompatActivity; import com.unity3d.player.UnityPlayerActivity; import android.os.Bundle; public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); } /** * 测试 * @return */ public int test(){ return 666; } }
7、修改AndroidManifest.xml文件,如下所示。
最终文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player"> <application> <activity android:name="com.aitu.unityandroidutils.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>
8、生成jar包
选择菜单栏Build-Make Module,进行build。
生成完成之后,找到对应的jar包。jar包在build/intermediates/aar_main_jar/debug下。
使用解压软件,删除com.unity3d.player包,将jar包和Androidmanifest.xml文件导入到Unity项目中。
在Unity中调用test方法。
/// <summary>
/// 测试
/// </summary>
/// <returns></returns>
private int Test()
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
int value = jo.Call<int>("isWiredHeadsetOn");
return value;
}
}
AndroidJavaObject是java.lang.Object通用实例的Unity表示。
它可以用作任何Java类实例的无类型接口。
方法 | 作用 |
---|---|
Call | 调用该对象的Java方法(非静态)。 |
CallStatic | 调用此类的静态方法。 |
CloneReference | 创建引用同一Java对象的C#对象的克隆。 |
Dispose | IDisposable 回调。 |
Get | 获取对象中字段的值(非静态)。 |
GetRawClass | 检索指向 Java 类的原始 jclass 指针。注意:使用原始 JNI 函数需要具备 Android Java 原生接口 (JNI) 的高级知识。 |
GetRawObject | 检索指向 Java 对象的原始 jobject 指针。注意:使用原始 JNI 函数需要具备 Android Java 原生接口 (JNI) 的高级知识。 |
GetStatic | 获取对象中静态字段的值。 |
Set | 设置对象中字段的值(非静态)。 |
SetStatic | 设置对象中静态字段的值。 |
Android与Unity交互–接入安卓原生SDK_付帅v的博客-CSDN博客_android 对接unity
尾语
如果有写的不对的地方,欢迎各位大佬批评指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。