欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Unity和Android Studio交互

程序员文章站 2022-03-11 23:02:01
Unity和Android Studio交互最近在研究unity接入百度地图,在尝试将Android接入unity这一块总是出现各种各样的错误,参考各类教程尝试了很多种方法,甚至把软件也升级了,终于是成功了,泪目。截图来自已完成项目,大致还原一下过程。软件版本Android studio3.5.2Unity2019.3.7f1Android Studio1、创建新项目这里需要记住你选择的Minimum API level。2、创建Modules后期就是从这个Modules中导出jar包...

Unity和Android Studio交互

最近在研究unity接入百度地图,在尝试将Android接入unity这一块总是出现各种各样的错误,参考各类教程尝试了很多种方法,甚至把软件也升级了,终于是成功了,泪目。
截图来自已完成项目,大致还原一下过程。

软件版本

Android studio3.5.2
Unity2019.3.7f1

Android Studio

1、创建新项目

这里需要记住你选择的Minimum API level。
Unity和Android Studio交互

2、创建Modules

后期就是从这个Modules中导出jar包。
Unity和Android Studio交互Unity和Android Studio交互
Unity和Android Studio交互
Unity和Android Studio交互
Unity和Android Studio交互
这样就创建成功啦。

3、添加Unity的classes.jar

classes.jar路径:Unity的安装路径下\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes

另外UnityPlayerActivity类在Unity2019.2以后,被单独提取出来了:Unity的安装路径下\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player

复制后,classes.jar粘贴到Modules下的libs文件夹中。UnityPlayerActivity类粘贴到包名文件夹下。
(!!我看到有的教程在这一步中会将classes.jar右键Add as library,实际上并不需要!!)
(!!加了会导致依赖重复,致使最终导出的jar包不可用!!)
Unity和Android Studio交互Unity和Android Studio交互

4、添加通信类

Unity和Android Studio交互Unity和Android Studio交互
编写如下:

package com.myunity.utest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;

public class MainActivity extends UnityPlayerActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    //unity调用Android
    public void UnityCallAndroid () {
        Toast.makeText(this,"unity调用android成功", Toast.LENGTH_LONG).show();
        AndroidCallUnity();
    }

    //android调用unity
    public void AndroidCallUnity () {
        //第1个参数为Unity场景中用于接收android消息的对象名称
        //第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
        //第3个参数为unity方法的参数
        UnityPlayer.UnitySendMessage("receiveObj", "UnityMethod", "This is args.");
    }
}

5、修改utest中的AndroidManifest.xml

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

    <application>
        <!-- 这个android:name的值必须为包名+类名-->
        <activity android:name="com.myunity.utest.MainActivity">
            <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>

6、导出jar包

先在utest的build.gradle中添加:
其中from(‘build/intermediates/packaged-classes/release/’)中的packaged-classes/release/是放置classes.jar的文件夹,不同AS版本会有一定的差异。

//----------------这是一组将module导出为jar的gradle命令-------------------
task deleteOldJar(type: Delete) {
    delete 'release/AndroidPlugin.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
    from('build/intermediates/packaged-classes/release/')
    into('release/')
    include('classes.jar')
    ///Rename the jar
    rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteOldJar, build)
//------------命令结束------------------------------

点击右上角的Gradle-utest-other中找到exportJar,双击进行jar导包
Unity和Android Studio交互Unity和Android Studio交互
若成功导出,则可以在utest/release下找到AndroidPlugin.jar。

Unity

1、新建Unity工程

新建一个Unity工程。
在Assets目录下新建文件夹Plugins/Android/bin。
将utest的AndroidManifest.xml拷贝到Assets/Plugins/Android目录下。
将AndroidPlugin.jar拷贝到Assets/Plugins/Android/bin目录下。
(若有需要存放其它Android插件,则存放于Assets/Plugins/Android/libs目录下)

2、UI制作

在当前场景创建一个Canvas,其下创建空物体命名为receiveObj,receiveObj下创建一个文本对象和一个按钮对象。将SDKTest脚本挂载到receiveObj下。
SDKTest脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SDKTest : MonoBehaviour
{
    private AndroidJavaClass jc;
    private AndroidJavaObject jo;

    private Button btn;
    private Text text;

    private void Awake()
    {
        btn = transform.Find("Button").GetComponent<Button>();
        text = transform.Find("Text").GetComponent<Text>();

        //这两行是固定写法
        jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        btn.onClick.AddListener(OnBtnClickHandler);
    }

    private void OnBtnClickHandler()
    {
        //调用Android中的方法UnityCallAndroid
        jo.Call("UnityCallAndroid");
    }

    /// <summary>
    ///  被Android中AndroidCallUnity调用
    /// </summary>
    /// <param name="str"></param>
    public void UnityMethod(string str)
    {
        Debug.Log("UnityMethod被调用,参数:" + str);
        text.text = str;
    }
}

3、导出测试

在File-Build Setting中切换Android平台,玩家设置中修改包名、最低API级别(必须和utest一致)。然后就可以导出apk在真机中安装后测试啦。
(!!在Unity中试运行会有个报错,需要到真机中测试!!)
若点击按钮后出现以下画面,则表示成功啦!!
Unity和Android Studio交互

本文地址:https://blog.csdn.net/qq_22529809/article/details/107370210

相关标签: Unity unity