Unity和Android Studio交互
Unity和Android Studio交互
最近在研究unity接入百度地图,在尝试将Android接入unity这一块总是出现各种各样的错误,参考各类教程尝试了很多种方法,甚至把软件也升级了,终于是成功了,泪目。
截图来自已完成项目,大致还原一下过程。
软件版本
Android studio3.5.2
Unity2019.3.7f1
Android Studio
1、创建新项目
这里需要记住你选择的Minimum API level。
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
推荐阅读
-
解析Android中webview和js之间的交互
-
详解关于Android Studio中安装和gradle的一些坑
-
详解Android Studio如何导入第三方类库、jar包和so库
-
Android studio窗口布局怎么保存和恢复?
-
神经网络API、Kotlin支持,那些你必须知道的Android 8.1预览版和Android Studio 3.0新特性
-
Android Studio和eclipse有什么不同?
-
Android Studio 3.0 新功能全面解析和旧项目适配问题
-
Android studio 自动换行和取消自动换行操作
-
关于Android studio的安装和配置问题
-
Android Studio实现标题栏和状态栏的隐藏