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包

  1. 打开之前学习Unity和Android交互中建立的Android工程

  2. com.taikr.mytestgame​ 上点击右键,新建一个空的Activity

    image

    打开对应的xml,在Activity内随便布局一些控件即可:

    image

  3. 检查AndroidManifest.xml​中是否多出了对应的Activity配置

    image

  4. 在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
    39
    package 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;

    @Override
    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);
    }
    }
  5. 生成aar包

Unity中进行交互处理

将aar包导入Unity后进行相关设置后导出包

  1. 按照之前讲解的知识点,删除aar包中需要删除的内容

  2. 书写对应交互逻辑,用于测试打开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
    58
    using 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;
    }
    }
  3. 在Unity中导出Android Studio工程,用Android Studio打开

注意:
如果要实现内嵌Android Activity,我们需要在Unity中导出安卓工程包后使用Android Studio进行打包
主要原因是,Unity中无法下载关联的相关包,会导致打包出去的内容报错

使用Android Studio打包

使用Android Studio打开我们通过Unity生成的Android工程
利用之前学习的Android Studio打包的相关知识,进行构建,打包
根据报错,来针对性的进行修改和配置

可能出现的报错:

  1. 打包出去后,运行后闪退,找不到对应类

    解决方案:引用缺失的包,重新打包

  2. 安装后出现两个图标

    Screenshot_20240406_224759_com.huawei.android.lau

    解决方案:修改AndroidManifest.xml配置文件,移除LAUNCHER相关配置

    image

  3. 界面xml报错,大量报错,且发现Activity无法显示

    解决方案:需要修改构建配置文件 加一个对应的引用 然后还需要在属性配置当中允许使用 Androidx

    image

    这段话可以复制自创建arr包的工程内的build.gradle

    image

    然后,在gradle.properties​内添加 允许使用 Androidx 语句

    image

  4. 如果出现了Appcompat报错

    解决方案:

    1. 修改配置文件 加一个android:theme = "@style/Theme.AppCompat.Dialog"
    2. 让我们新建的Activity直接继承Activity

等等(根据具体报错内容,查询资料进行解决)

如果以上错误都没有再度出现了,安装生成的apk到真机或者模拟器上,查看效果:

Screenshot_20240402_231059_com.taikr.mytestgame

点击打开嵌入到Unity的安卓Activity​按钮后进入这个页面:

Screenshot_20240402_231103_com.taikr.mytestgame

至此,Unity中嵌入Android内容就已经完成