[Unity学习教程] Unity与安卓交互

[复制链接]
查看748 | 回复0 | 2023-8-23 11:54:56 | 显示全部楼层 |阅读模式 来自 中国北京
Unity与安卓交互

弁言

在Unity的项目开辟过程中,总会碰到Unity提供的方法不敷以支持安卓平台的开辟,这时间我们就必要引用安卓平台本身的一些方法或者SDK来帮助我们继承开辟,那么Unity和安卓原生时怎么举行交互的呢,在这里我们做一下简朴的极少。
工具



  • Unity:2019.4.31f1c1
  • Android Studio:2020.3.1
天生jar包

此过程重要在Android Studio中完成。
创建工程

1、创建一个Empty Activity,点击Next

2、根据本身必要设置对应的项目名称和最小SDK版本,项目名称不必要和Unity包名一样,最小SDK版本必要和Unity中设置的一样。

unity中设置最小SDK

工程设置

1、删除两个无用的工程

2、修改build.gradle


  • plugins下的id改为com.android.library
  • 删除defaultConfig下的applicationId

3、点击sync now

4、参加Unity classes.jar
jar泉源:unity工具安装目次下的\Editor\Data\PlaybackEngines\AndroidPlayer\Variations,此文件夹中有il2cpp和mono两个文件夹,根据unity的编译选择对应的文件夹下的\Release\Classes\下的classes.jar
  1. 例如: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类,必要本技艺动添加。
  1. C:\Program Files\Unity\Hub\Editor\2019.4.31f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source
复制代码
找到对应路径下的com文件夹,复制到java文件夹下。

6、修改MainActivity类,使其继承UnityPlayerActivity。

  1. package com.aitu.unityandroidutils;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import com.unity3d.player.UnityPlayerActivity;
  4. import android.os.Bundle;
  5. public class MainActivity extends UnityPlayerActivity {
  6.     @Override
  7.     protected void onCreate(Bundle savedInstanceState) {
  8.         super.onCreate(savedInstanceState);
  9.         //setContentView(R.layout.activity_main);
  10.     }
  11.     /**
  12.      * 测试
  13.      * @return
  14.      */
  15.     public int test(){
  16.         return 666;
  17.     }
  18. }
复制代码
7、修改AndroidManifest.xml文件,如下所示。

终极文件:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.unity3d.player">
  4.     <application>
  5.         <activity
  6.             android:name="com.aitu.unityandroidutils.MainActivity"
  7.             android:exported="true">
  8.             <intent-filter>
  9.                 <action android:name="android.intent.action.MAIN" />
  10.                 <category android:name="android.intent.category.LAUNCHER" />
  11.             </intent-filter>
  12.             <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
  13.         </activity>
  14.     </application>
  15. </manifest>
复制代码
8、天生jar包
选择菜单栏Build-Make Module,举行build。

天生完成之后,找到对应的jar包。jar包在build/intermediates/aar_main_jar/debug下。

利用解压软件,删除com.unity3d.player包,将jar包和Androidmanifest.xml文件导入到Unity项目中。
Unity调用

在Unity中调用test方法。
  1. /// <summary>
  2. /// 测试
  3. /// </summary>
  4. /// <returns></returns>
  5. private int Test()
  6. {
  7.     using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
  8.     {
  9.         AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  10.         int value = jo.Call<int>("isWiredHeadsetOn");
  11.         return value;
  12.     }
  13. }
复制代码
AndroidJavaObject



  • AndroidJavaObject是java.lang.Object通用实例的Unity表示。
  • 它可以用作任何Java类实例的无范例接口。
  • 官方文档:Unity - Scripting API: AndroidJavaObject (unity3d.com)
方法作用Call调用该对象的Java方法(非静态)。CallStatic调用此类的静态方法。CloneReference创建引用同一Java对象的C#对象的克隆。DisposeIDisposable 回调。Get获取对象中字段的值(非静态)。GetRawClass检索指向 Java 类的原始 jclass 指针。注意:利用原始 JNI 函数必要具备 Android Java 原生接口 (JNI) 的高级知识。GetRawObject检索指向 Java 对象的原始 jobject 指针。注意:利用原始 JNI 函数必要具备 Android Java 原生接口 (JNI) 的高级知识。GetStatic获取对象中静态字段的值。Set设置对象中字段的值(非静态)。SetStatic设置对象中静态字段的值。 AndroidJavaClass



  • AndroidJavaClass是java.lang.Class的通用实例的Unity表示。
  • 继承自AndroidJavaObject
  • 官方文档:Unity - Scripting API: AndroidJavaClass (unity3d.com)
参考文档

Android与Unity交互–接入安卓原生SDK_付帅v的博客-CSDN博客_android 对接unity
尾语
假如有写的不对的地方,欢迎各位大佬批评指正。

来源:https://blog.csdn.net/yr1102358773/article/details/128287330
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则