5.Unity中嵌入Android内容

5.Unity中嵌入Android内容


5.1 知识点

Unity中嵌入Android内容指什么

在Android开发中,Activity(活动)是指用户界面(屏幕)的一个单独界面。因此,Unity中嵌入Android内容就是通过Unity打开Android中已经制作好的Activity,从而实现Unity和Android中制作的功能进行交互。

注意:本部分仅涉及Unity如何开启Android中的Activity,具体的安卓开发相关知识需要单独学习。

Activity创建

主要目标:在Android项目中新建一个Activity并生成aar包

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

在com.tao.unityandroidtestgame上点击右键,新建一个空的Activity。并添加文本和按钮






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

在MainActivity中添加函数,用于打开新建的Activity

public void OpenActivity()
{
    // 创建一个新的 Intent 对象,用于启动我们新创建的AndroidActivity
    Intent intent = new Intent(this, AndrioidActivity.class);

    // 使用 startActivity 方法启动指定的 Activity
    startActivity(intent);
}

重新生成aar包,准备重新导入aar包和清单文件到Unity

Unity中进行交互处理并导出安卓包

将aar包导入Unity后进行相关设置后导出包,按照之前讲解的知识点,删除aar包中需要删除的内容

书写对应交互逻辑,用于测试打开Android中的Activity

private AndroidJavaClass androidJavaClass;
private AndroidJavaObject androidJavaObject;

public Button btnOpenAndroidActivity;

void Start()
{
    androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");

    btnOpenAndroidActivity.onClick.AddListener((() =>
    {
        androidJavaObject.Call("OpenActivity");
    }));
}

private void OnDestroy()
{
    androidJavaClass.Dispose();
    androidJavaClass = null;
    androidJavaObject.Dispose();
    androidJavaObject = null;
}

在Unity中导出包,用Android Studio打开

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

使用Android Studio打包

使用Android Studio打包概述

使用Android Studio打开我们通过Unity生成的Android包,根据报错,来针对性的进行修改和配置。

可能出现的报错:

  1. 打包出去后,运行后闪退,找不到对应类。
    解决方案:引用缺失的包,重新打包。
  2. 安装后出现两个图标。
    解决方案:修改AnadroidManifest.xml配置文件,移除LAUNCHER相关配置。
  3. 界面xml报错。
    解决方案:需要修改构建配置文件,加一个对应的引用,然后还需要在属性配置当中允许使用Androidx。
  4. 如果出现了Appcompat报错。
    • 修改配置文件,加一个android:theme = “@style/Theme.AppCompat.Dialog”。
    • 让我们新建的Activity直接继承Activity。

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

打开打出来的安卓包,更新sdk






逐步点击构建apk,根据报错提示信息进行不同的处理

  • 删除android.enableR8=false。

  • layout_constraintBottom_toBottomOf包丢失。build.gradle中添加constraintlayout依赖。
    • 补充依赖:implementation ‘androidx.constraintlayout:constraintlayout:2.1.4’
    • 可以去交互安卓工程中找
    • 拷贝到Unity打包的安卓工程,重新同步再打包apk。
  • 让android.useAndroidX=true。
  • 正常来说apk可以构建成功了。

生成apk

拖入apk到模拟器中,安装后出现两个图标


  • 解决方案:修改unityLibrary的AnadroidManifest.xml配置文件,移除LAUNCHER相关配置,重新生成apk。

运行成功


总结

Unity中嵌入Android内容的关键点就是最终打包时,我们需要在Unity中打包出安卓工程包后,再使用Android Studio进行打包。根据各种报错信息来一步步的解决问题,缺少什么就添加什么,配置有问题就修改配置。

如果以后有需求需要嵌入安卓相关内容,那么需要系统的学习一些安卓开发的相关知识,可以购买一些安卓开发相关书籍来学习。


5.2 知识点代码

MainActivity

package com.tao.unityandroidtestgame;

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;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
    }

    //测试成员函数
    public String TestFun()
    {
        // 在返回前可以尝试调用Unity的函数
        //  交互时,在Android端调用API:
        //  UnityPlayer.UnitySendMessage("对象名", "函数名", "参数信息")
        //  注意:该API中的参数只能是String类型或者为null
        UnityPlayer.UnitySendMessage("Lesson03", "TestAndroidCallUnity", "AndroidCallUnity");

        return "String";
    }

    //测试静态函数
    public static String TestStaticFun()
    {
        return "TestStaticFun";
    }

    public void OpenActivity()
    {
        // 创建一个新的 Intent 对象,用于启动我们新创建的AndroidActivity
        Intent intent = new Intent(this, AndrioidActivity.class);

        // 使用 startActivity 方法启动指定的 Activity
        startActivity(intent);
    }

}

AndrioidActivity

package com.tao.unityandroidtestgame;



import android.app.Activity;
import android.os.Bundle;

public class AndrioidActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_andrioid);
    }
}

Lesson05_Unity中嵌入Android内容

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


public class Lesson05_Unity中嵌入Android内容 : MonoBehaviour
{
    private AndroidJavaClass androidJavaClass;
    private AndroidJavaObject androidJavaObject;

    public Button btnOpenAndroidActivity;
    
    void Start()
    {
        #region 知识点一 Unity中嵌入Android内容指什么

        //从上节课中我们知道
        //在Android开发中Activity(活动)就是我们看到的一个界面(屏幕)
        //那么所谓的Unity中嵌入Android内容就是通过Unity打开Android中制作好的Activity
        //让Unity可以和Android中制作的功能进行交互

        //注意:学习这部分知识我们只学习Unity如何开启Android中的Activity
        //     具体的安卓开发相关需要自行学习安卓相关知识,不属于本课程范围内

        #endregion

        #region 知识点二 Activity创建

        //在Android项目中新建一个Activity并生成aar包
        //1.打开我们之前学习Unity和Android交互中建立的Android工程
        //2.在com.tarkr.mytestgame上点击右键,新建一个空的Activity
        //3.检查AnadroidManifest.xml中是否多出了对应的Activity配置
        //4.在MainActivity中添加函数,用于打开新建的Activity
        //5.生成aar包

        #endregion

        #region 知识点三 Unity中进行交互处理

        //将aar包导入Unity后进行相关设置后导出包
        //1.按照之前讲解的知识点,删除aar包中需要删除的内容
        //2.书写对应交互逻辑,用于测试打开Android中的Activity
        //3.在Unity中导出包,用Android Studio打开

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


        androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");

        btnOpenAndroidActivity.onClick.AddListener((() =>
        {
            androidJavaObject.Call("OpenActivity");
        }));

        #endregion

        #region 知识点四 使用Android Studio打包

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

        //可能出现的报错:
        //1.打包出去后,运行后闪退,找不到对应类。
        //  解决方案:引用缺失的包,重新打包
        //2.安装后出现两个图标。
        //  解决方案:修改AnadroidManifest.xml配置文件,移除LAUNCHER相关配置
        //3.界面xml报错。
        //  解决方案:需要修改构建配置文件 加一个对应的引用 然后还需要在属性配置当中允许使用 Androidx
        //4.如果出现了Appcompat报错。解决方案:
        //  3-1.修改配置文件 加一个android:theme = "@style/Theme.AppCompat.Dialog"
        //  3-2.让我们新建的Activity直接继承Activity
        //等等(根据具体报错内容,查询资料进行解决)

        #endregion

        #region 总结

        //Unity中嵌入Android内容的关键点就是
        //最终打包时,我们需要在Unity中打包出安卓工程包后
        //再使用Android Studio进行打包
        //根据各种报错信息来一步步的解决问题
        //缺少什么就添加什么,配置有问题就修改配置

        //如果以后有需求需要嵌入安卓相关内容,那么需要系统的学习一些安卓开发的相关知识
        //可以购买一些安卓开发相关书籍来学习

        #endregion
    }

    private void OnDestroy()
    {
        androidJavaClass.Dispose();
        androidJavaClass = null;
        androidJavaObject.Dispose();
        androidJavaObject = null;
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏