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包,根据报错,来针对性的进行修改和配置。
可能出现的报错:
- 打包出去后,运行后闪退,找不到对应类。
解决方案:引用缺失的包,重新打包。 - 安装后出现两个图标。
解决方案:修改AnadroidManifest.xml配置文件,移除LAUNCHER相关配置。 - 界面xml报错。
解决方案:需要修改构建配置文件,加一个对应的引用,然后还需要在属性配置当中允许使用Androidx。 - 如果出现了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