Android/iOS内嵌Unity开发示例

简介: Android/iOS内嵌Unity开发示例

前言


背景


Unity 与 Android/iOS 交叉开发主要有两种方式,以 Android 为例,一是 Android 生成 jar 或者 aar 包,导入到 unity3d plugin/bin/ 目录下;二是 Unity 导出 Android 工程,在 Android Studio 中作为库继续开发。网上的教程几乎全是第一种方式,而本文主要分析第二种方式。

这种方式可以在移动端的 NativeApp 中以库的形式集成已经写好的 Unity 工程,利用 Unity 游戏引擎便捷的开发手段进行跨平台开发。


Unity官方文档 Unity as a Library integration example to iOS and Android


以下以安卓平台作为示例。

正文


环境


  • Android Studio 3.5.3
  • Unity version 2019.3.7f1

新建工程


Android Studio 新建项目:

55333c2ed486404bbaa5a7253497931a.png

Unity 新建项目:

image.png

最终工程结构如下:

image.png

Unity导出


  • 通过 Unity 打开 UnityProject
  • 选择 File -> Build Settings -> Switch Android Platform -> Export Project

05166fbf9d944608ad1d1dc8c663c054.png

这时候选择Export可能会提示JDK路径配置出错,没关系我们到 Preference -> Externl Tools 设置路径

image.png

现在就可以点击 Export 了,路径选择可以自由选择,这里建议按照官方来

image.png

Android接入


  • 通过 Android Studio 打开 NativeAndroidApp
  • 选择 setting.gradle 文件添加 unityLibrary module
include ':unityLibrary'
project(':unityLibrary').projectDir = new File('..\\UnityProject\\androidBuild\\unityLibrary')
  • 选择 build.gradle(Module:app)添加 dependencies
dependencies {
    implementation project(':unityLibrary')
    implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar'])
    // 自己项目的配置
}

  • 选择 build.gradle(Module:NativeAndroidApp)
allprojects {
    repositories {
        google()
        jcenter()
        // Add Code
        flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
        // End
    }
}
  • 选择 NativeAndroidAppstrings.xml 添加
<resources>
    <string name="app_name">NativeAndroidApp</string>
    <string name="action_settings">Settings</string>
    // Add Code
    <string name="game_view_content_description">Game view</string>
    // End
</resources>
  • 点击 ASsync project,可以看到已经多了一个 module

image.png

现在我们可以直接使用这个 module 里的 java class 了。

如何使用


作为Activity


现在我们的工程包含了两个 module ,一个是新建工程自带的 app,一个是刚才导入的 unityLibrary。点开 unityLibrary 的目录可以看到两个主要的 class

image.png

其中 UnityPlayerActivity 是最重要的 class ,我们可以通过这个类在安卓 app 中显示 Unity 的场景。


至于如何使用—— OverrideUnityActivity 则是对 UnityPlayerActivity 用法的一个官方示例,里面的代码也很简单。

import com.unity3d.player.UnityPlayerActivity;
public abstract class OverrideUnityActivity extends UnityPlayerActivity
{
    public static OverrideUnityActivity instance = null;
    abstract protected void showMainActivity(String setToColor);
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        instance = this;
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        instance = null;
    }
}

显然官方希望我们在安卓内用一个 Activity 去显示 Unity 渲染的场景,至于这个 Activity ,直接继承 UnityPlayerActivity 就基本完事了,非常简单。

新建一个 Activity,这里命名为 SourceUnityActivity

public class SourceUnityActivity extends UnityPlayerActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

现在只要继承 UnityPlayerActivity 就行了。现在构建 app,进入 SourceUnityActivity 的时候就会显示 Unity 的场景了。

总结


1.Android调用Unity


//向unity发消息
UnityPlayer.UnitySendMessage("Main Camera", //gameobject的名字
                             "ChangeColor", //调用方法的名字
                             "");     //参数智能传字符串,没有参数则传空字符串

2.Unity调用Android


//通过该API来实例化java代码中对应的类
AndroidJavaObject jc = new AndroidJavaObject("com.xxx.xxx.UnityPlayer");
jo.Call("Test");//调用void Test()方法
jo.Call("Text1", msg);//调用string Test1(string str)方法
jo.Call("Text2", 1, 2);//调用int Test1(int x, int y)方法

3.C/C++“中转站”


以上的传参方式只能相互传递 string 字符串,少量数据传递时可以使用这种方式,如果是大量数据这样就有点限制了。其实我们可以把C/C++的代码做为一个中转站,实现两边的数据引用与共享。只要在安卓工程加入 NDK 支持和 c++ 源码,就可以在 Unity 端调用了。

其余进阶用法请自行摸索啦哈哈哈,包括Unity中内置插件自控摄像头某些场景的额外编程但不只于此......

参考资料


Unity - Manual: Android Library Projects and Android Archive plug-ins

Unity - Manual: Extend the default Unity activity

Unity - Manual: Native plug-ins for Android

Integration Unity as a library in native Android app - Unity Forum

unity3d - Display Unity Scene as Sub View in android studio - Stack Overflow


目录
相关文章
|
6天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
29天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
14 0
|
3天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
9天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
12 0
|
20天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
22天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。
|
22天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
25 1
Android开发之使用OpenGL实现翻书动画
|
22天前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
19 1
Android开发之OpenGL的画笔工具GL10
|
24天前
|
开发工具 Swift iOS开发
利用SwiftUI构建动态用户界面:iOS开发新范式
【4月更文挑战第3天】 随着苹果不断推进其软件开发工具的边界,SwiftUI作为一种新兴的编程框架,已经逐渐成为iOS开发者的新宠。不同于传统的UIKit,SwiftUI通过声明式语法和强大的功能组合,为创建动态且响应式的用户界面提供了一种更加简洁高效的方式。本文将深入探讨如何利用SwiftUI技术构建具有高度自定义能力和响应性的用户界面,并展示其在现代iOS应用开发中的优势和潜力。
|
29天前
|
Android开发
Android开发小技巧:怎样在 textview 前面加上一个小图标。
Android开发小技巧:怎样在 textview 前面加上一个小图标。
12 0