当前位置: 移动技术网 > 移动技术>移动开发>Android > Unity和Android Studio交互

Unity和Android Studio交互

2020年07月17日  | 移动技术网移动技术  | 我要评论

Unity和Android Studio交互

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

软件版本

Android studio3.5.2
Unity2019.3.7f1

Android Studio

1、创建新项目

这里需要记住你选择的Minimum API level。
1

2、创建Modules

后期就是从这个Modules中导出jar包。
在这里插入图片描述 在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就创建成功啦。

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包不可用!!)
在这里插入图片描述在这里插入图片描述

4、添加通信类

在这里插入图片描述在这里插入图片描述
编写如下:

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导包
在这里插入图片描述在这里插入图片描述
若成功导出,则可以在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中试运行会有个报错,需要到真机中测试!!)
若点击按钮后出现以下画面,则表示成功啦!!
在这里插入图片

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网