Unity与Android交互-扩展Unity的MainActivity

2023-11-10 23:59

本文主要是介绍Unity与Android交互-扩展Unity的MainActivity,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.前序准备

基础知识相关文章:https://blog.csdn.net/jiaxunnanling/article/details/89947744

新建工程,并引入Unity内置jar包相关文章:https://blog.csdn.net/jiaxunnanling/article/details/90268239

二.如何扩展 

由于Unity发布Android的Apk时,只包含一个主Acitivity,俗称MainActivity,可以通过扩展该Activity,达到预期效果。通过引入Unity内置的Android的Jar库,并继承库中的UnityPlayerActivity。

Unity内置的Android的Jar库地址在Unity目录:Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

其中classes.jar就是Unity内置的Android的Jar库,这是扩展MainActivity需要使用的库。

Unity在发布Android的Apk时

如果没有在目录Plugins/Android(Unity特殊目录)存放AndroidManifest文件,Unity会使用默认的AndroidManifest文件 。

如果存在AndroidManifest文件,Unity会使用该AndroidManifest文件替换默认的AndroidManifest

扩展Unity的MainActivity时,注意AndroidManifest配置的主要Activity入口,例如使用自己扩展的AndroidManifest代替Unity默认的AndroidManifest,这样Activity入口就是我们自定义的Activity入口。

关于AndroidManifest的合并,可以参考基础知识:https://blog.csdn.net/jiaxunnanling/article/details/89947744

三. 案例演示(导出Arr包)

如何引入Unity内置的jar包可以参考 :https://blog.csdn.net/jiaxunnanling/article/details/90268239

在模块的这个目录下,右键新建一个空的Activity,不知道新建模块的可以参考:

https://blog.csdn.net/jiaxunnanling/article/details/90268239

目录结构,移除不必要的东西

修改MainAcitivity的代码,继承UnityPlayerActivity

package com.huowu.add;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}
}

修改AndroidManifest的文件内容,可以从其他地方复制过来再修改 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.huowu.add"><applicationandroid:label="@string/app_name"android:usesCleartextTraffic="true"><activityandroid:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-dataandroid:name="unityplayer.UnityActivity"android:value="true" /></activity></application></manifest>

 

 在MainActivity中,添加一个加法运算方法,相当于扩展UnityPlayerActivity的功能

package com.huowu.add;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}//加法运算public int Add(int num1,int num2){int sum = num1 + num2;return sum;}
}

 

 选择该模块,选择菜单条的Build=>Make Module '模块名'

 编译好了之后,在目录build=>outputs=>arr

复制一份arr出来,用压缩软件,推荐使用7z,打开arr包,跟jar包的区别里面包含有很多文件

打开libs,把里面的classes.jar删掉,这是我们之前导入的Unity内置的jar包,为什么要删掉,在基础知识提过,Unity打包的时候会把内置的jar包引入,如果这个arr包也引入了,就会产生冲突。

 

 把arr包里面的AndroidManifest文件复制一份出来,作为自定义的AndroidManifest文件,用来替换Unity默认的AndroidManifest文件。

把Arr包与AndroidManifest文件,一起放入Unity工程中的Assets目录下Plugins/Android(没有这些目录就创建) 

新建脚本,AndroidToUnity,挂载到UI文本组件上界面,涉及到的内容,可以参考基础知识:https://blog.csdn.net/jiaxunnanling/article/details/89947744

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using  UnityEngine.UI;public class AndroidToUnity : MonoBehaviour
{public Text text; //用来显示结果值private AndroidJavaClass androidJavaClass; //获取Unity发布的唯一MainActivity类private AndroidJavaObject androidJavaObject;//获取Activity对象public void Awake(){text = this.GetComponent<Text>();//Unity要导出的MainActivity类androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//获取MainActivity的实例对象androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");      }public void Start(){Add();}public void Add(){//调用Android写好的add的方法,并传参,获取结果值int sum = androidJavaObject.Call<int>("Add",5,5);text.text = "从Android计算出来的值为:" + sum;}
}

 

 发布APK,运行在模拟器的结果

四. 导出Jar包

Build Module后,打开目录build=>intermediates=>packaged-classes=>debug

以及 build=>intermediates=>manifest=>full=>debug

(注意我的AndroidStudio版本是3.1.3,其余的版本的目录可能不一样)

 复制build=>intermediates=>packaged-classes=>debug中的classes,该目录下的libs是我们之前引用的Unity内置jar包,所以不需要复制出来,如果是其他jar包就需要一同复制出来。

复制 build=>intermediates=>manifest=>full=>debug目录下的AndroidManifest文件。

把classes和AndroidManifest文件一起导入的Unity工程下的Assets/Plugins/Android目录下,按照导出arr包时,编写AndroidToUnity一样,运行的效果是一样的。

区别在于Jar包没有过多的文件,相关联的文件需要自己去找。

Arr包已经把涉及到的资源都整理成一套了。

这篇关于Unity与Android交互-扩展Unity的MainActivity的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/386151

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级