Android与Unity3D的交互实现

Unity与安卓交互

引言

在Unity的项目开发过程中,总会遇到Unity提供的方法不足以支撑安卓平台的开发,这时候我们就需要引用安卓平台本身的一些方法或者SDK来帮助我们继续开发,那么Unity和安卓原生时怎么进行交互的呢,在这里我们做一下简单的极少。

工具

  • Unity:2019.4.31f1c1
  • Android Studio:2020.3.1

生成jar包

此过程主要在Android Studio中完成。

创建工程

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

android与unity3d的交互 unity 安卓交互_android与unity3d的交互

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

android与unity3d的交互 unity 安卓交互_android与unity3d的交互_02

unity中设置最小SDK

android与unity3d的交互 unity 安卓交互_jar包_03

工程设置

1、删除两个无用的工程

android与unity3d的交互 unity 安卓交互_unity_04

2、修改build.gradle

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

android与unity3d的交互 unity 安卓交互_android与unity3d的交互_05

3、点击sync now

android与unity3d的交互 unity 安卓交互_android与unity3d的交互_06

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编译方式

android与unity3d的交互 unity 安卓交互_android_07

将jar包复制到android studio工程的libs文件夹下,并且添加为库(Add As Library)。

android与unity3d的交互 unity 安卓交互_Java_08

5、这个版本的classes.jar中不包含UnityPlayerActivity.java类,需要自己手动添加。

登录后复制


C:\Program Files\Unity\Hub\Editor\2019.4.31f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source

找到对应路径下的com文件夹,复制到java文件夹下。

android与unity3d的交互 unity 安卓交互_jar包_09

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

android与unity3d的交互 unity 安卓交互_android_10

登录后复制


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文件,如下所示。

android与unity3d的交互 unity 安卓交互_jar包_11

最终文件:

登录后复制


<?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。

android与unity3d的交互 unity 安卓交互_android与unity3d的交互_12

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

android与unity3d的交互 unity 安卓交互_Java_13

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

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

方法作用
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


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空