UM3L5——Unity中嵌入Android内容
UM3L5——Unity中嵌入Android内容
Unity中嵌入Android内容
从 UM3L4——Android开发必备原理 中我们知道
在Android开发中Activity(活动)就是我们看到的一个界面(屏幕)
那么所谓的 Unity中嵌入Android内容 就是 通过Unity打开Android中制作好的Activity
让Unity可以和Android中制作的功能进行交互
注意:学习这部分知识我们只学习Unity如何开启Android中的Activity,具体的安卓开发相关需要自行学习安卓相关知识,不属于本课程范围内!
Unity中嵌入Android内容的关键点就是:最终打包时,我们需要在Unity中打包出安卓工程包后再使用Android Studio进行打包
根据各种报错信息来一步步的解决问题,缺少什么就添加什么,配置有问题就修改配置
如果以后有需求需要嵌入安卓相关内容,那么需要系统的学习一些安卓开发的相关知识,可以购买一些安卓开发相关书籍来学习
Activity创建
在Android项目中新建一个Activity并生成aar包
-
打开之前学习Unity和Android交互中建立的Android工程
-
在
com.taikr.mytestgame
上点击右键,新建一个空的Activity
打开对应的xml,在Activity内随便布局一些控件即可:
-
检查
AndroidManifest.xml
中是否多出了对应的Activity配置
-
在MainActivity中添加函数,用于打开新建的Activity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39package com.taikr.mytestgame;
import android.content.Intent;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
//用于测试的成员变量相关
public int testI;
public static int testStaticI = 20;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
}
//用于测试的成员函数
public String TestFun() {
//在返回之前 先调用Unity当中的某个函数
UnityPlayer.UnitySendMessage("ACU", "TestAndroidCallUnity", "你好Unity");
return "String";
}
//用于测试的静态成员函数
public static String TestStaticFun() {
return "TestStaticFun";
}
//打开一个Activity(界面、屏幕、窗口)
public void OpenActivity() {
//创建一个意图对象,传入自己和要打开的Activity
Intent intent = new Intent(this, AndroidActivity.class);
//打开Activity
startActivity(intent);
}
} -
生成aar包
Unity中进行交互处理
将aar包导入Unity后进行相关设置后导出包
-
按照之前讲解的知识点,删除aar包中需要删除的内容
-
书写对应交互逻辑,用于测试打开Android中的Activity
在场景上创建一个UI按钮,点击后,打开Android中的Activity
值得一提的是,对于需要复用的AndroidJavaClass
和AndroidJavaObject
,可以使用成员变量存储起来
但是一旦交互完毕后就必须要主动去销毁Dispose()
并释放它1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58using UnityEngine;
using UnityEngine.UI;
public class AndroidTest : MonoBehaviour
{
public Text txtOld;
public Text txtNew;
public Text txtStaticOld;
public Text txtStaticNew;
public Text txtTestFun;
public Text txtTestStaticFun;
public Button btnOpen;
AndroidJavaClass javaClass;
AndroidJavaObject javaObj;
void Start()
{
javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
javaObj = javaClass.GetStatic<AndroidJavaObject>("currentActivity");
//成员变量的获取和改变
int i = javaObj.Get<int>("testI");
txtOld.text = i.ToString();
javaObj.Set<int>("testI", 11);
i = javaObj.Get<int>("testI");
txtNew.text = i.ToString();
//静态成员变量的获取和改变
int staticI = javaObj.GetStatic<int>("testStaticI");
txtStaticOld.text = staticI.ToString();
javaObj.SetStatic<int>("testStaticI", 21);
staticI = javaObj.GetStatic<int>("testStaticI");
txtStaticNew.text = staticI.ToString();
//调用有返回值的成员函数
string testFunStr = javaObj.Call<string>("TestFun");
txtTestFun.text = testFunStr;
//调用有返回值的静态函数
string testStaticFunStr = javaObj.CallStatic<string>("TestStaticFun");
txtTestStaticFun.text = testStaticFunStr;
//打开嵌入到Unity内的安卓的Activity
btnOpen.onClick.AddListener(() =>
{
javaObj.Call("OpenActivity");
});
}
private void OnDestroy()
{
//不用了以后,就必须要销毁掉
javaClass.Dispose();
javaClass = null;
javaObj.Dispose();
javaObj = null;
}
} -
在Unity中导出Android Studio工程,用Android Studio打开
注意:
如果要实现内嵌Android Activity,我们需要在Unity中导出安卓工程包后使用Android Studio进行打包
主要原因是,Unity中无法下载关联的相关包,会导致打包出去的内容报错
使用Android Studio打包
使用Android Studio打开我们通过Unity生成的Android工程
利用之前学习的Android Studio打包的相关知识,进行构建,打包
根据报错,来针对性的进行修改和配置
可能出现的报错:
-
打包出去后,运行后闪退,找不到对应类
解决方案:引用缺失的包,重新打包
-
安装后出现两个图标
解决方案:修改AndroidManifest.xml配置文件,移除LAUNCHER相关配置
-
界面xml报错,大量报错,且发现Activity无法显示
解决方案:需要修改构建配置文件 加一个对应的引用 然后还需要在属性配置当中允许使用 Androidx
这段话可以复制自创建arr包的工程内的
build.gradle
然后,在
gradle.properties
内添加 允许使用 Androidx 语句
-
如果出现了Appcompat报错
解决方案:
- 修改配置文件 加一个
android:theme = "@style/Theme.AppCompat.Dialog"
- 让我们新建的Activity直接继承Activity
- 修改配置文件 加一个
等等(根据具体报错内容,查询资料进行解决)
如果以上错误都没有再度出现了,安装生成的apk到真机或者模拟器上,查看效果:
点击打开嵌入到Unity的安卓Activity
按钮后进入这个页面:
至此,Unity中嵌入Android内容就已经完成