AR开发中的Unity 3D与原生代码交互技术
2017-12-06魏三强
魏三强
(1.宿州职业技术学院 计算机信息系, 安徽 宿州 234101;2.中国矿业大学 信息与控制工程学院, 江苏 徐州 221116)
AR开发中的Unity3D与原生代码交互技术
魏三强1,2
(1.宿州职业技术学院 计算机信息系, 安徽 宿州 234101;2.中国矿业大学 信息与控制工程学院, 江苏 徐州 221116)
为了解决AR产品开发过程中Unity 3D与原生代码之间的交互问题,分别介绍了Unity 3D与Android原生代码、Unity 3D与iOS原生代码之间的交互技术。通过一个AR系统实例开发,应用图像识别、匹配和交互等技术实现了虚实结合的视觉体验效果。实验测试结果表明:系统运行稳定,效果逼真。说明运用Unity 3D与原生代码之间的交互技术,能够合理解决AR产品开发过程中Unity 3D与原生代码之间的交互问题。
AR; Unity 3D; Android原生代码; iOS原生代码; 交互
在AR(augmented reality,增强现实)产品的开发过程中,经常需要与系统原生代码进行相互调用。由于目前很多AR应用都是使用C#、JavaScript配合Unity 3D进行开发,而大部分传统应用都是使用原生语言开发,比如Android系统使用Java语言开发,而iOS系统使用Objective-C或Swift进行开发[1]。在国内一些AR产品开发实例中,林一[2]等提出了一套基于心智模型VR与AR混合式移动导览系统;上官大堰[3]等进行了基于Android平台的Unity 3D网络功能的开发;于意[4]设计与实现了一个基于iOS移动平台的Unity 3D幼儿认知游戏;李智鹏[5]设计并实现了一个基于Unity 3D引擎的空中战机游戏;邓增强[6]等使用Unity 3D引擎开发了一款 3D街机游戏,实现了Unity 3D与Android之间的数据交互。在以上AR系统开发实践中,不可避免地需要在Unity 3D中调用Android原生接口,或从Objective-C给Unity 3D接口发送消息。鉴于此,本文拟对AR产品开发中的Unity 3D与Android、iOS原生代码之间的交互技术进行研究,以期合理解决AR产品开发过程中Unity 3D与原生代码之间的交互问题。
1 预备知识
1.1 AR增强现实
增强现实简称AR,是一种实时计算摄像机捕捉到的现实影像的位置及角度并加上相应虚拟信息的技术。它不仅能够展现真实世界的信息,还能够通过增加虚拟信息而对现实世界进行增强,AR系统结构图如图1所示。AR系统中的交互方式主要有基本命令式交互、双手交互、多通道交互、特殊工具的交互等方式[7]。AR可应用于游戏、军事、医疗、教育、文物古迹保护、旅游、工业等众多领域[8],随着硬件性能的不断提升和软件解决方案的日趋成熟,AR产品将越来越多地走入人们的视线。
1.2 Unity 3D游戏引擎
Unity 3D是由Unity Technologies公司开发的一个专业游戏引擎,它让玩家能够轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具如图2所示[9]。
图1 AR系统结构图
图2 Unity 3D开发环境
使用Unity 3D开发的游戏不计其数,其中比较经典的网页游戏如坦克英雄、魔晶星球、木乃伊和极限摩托车等,手机游戏如失落帝国、战舰少女、全民炫舞和出租车司机等,单机游戏如轩辕剑六、御天降魔传和金庸群侠传等。目前,Unity 3D已经成为开发AR项目的主流引擎[9-10]。
2 Unity 3D与原生代码之间的交互
2.1 Unity 3D与Android原生代码之间的交互
Android开发环境主要是Eclipse和Android Studio,本小节内容主要是在Eclipse下配置好Android开发环境(包括下载和安装JDK并配置环境变量,下载和安装Android SDK并在Eclipse中配置并指定Android SDK)。在开发环境配置完成后,新建一个Android工程,将Unity 3D工程导出为Android工程,用Eclipse打开从Unity 3D导出的工程,该工程中有UnityPlayerActivity.java这个文件,它是进行Unity 3D与Android互通的关键所在。接着,在Unity的3D界面前添加一个Android原生界面,主要包括以下几个步骤[11]。
1) 创建新的文件Activity,核心代码如下:
public class MainMenuActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.mainmenu);
Button btn=(Button)this.findViewById(R.id.startButton);
//用该语句为按钮添加一个点击事件,并且将它切换至Unity 3D的Activity
btn.setOnClickListener(new OnClickListener( ) {
@Override
Public void onClick(View v) {
Intent it=new Intent( );
it.setClass(MainMenuActivity.this,UnityPlayerActivity.class);
MainMenuActivity.this.StartActivity(it);
}
});
}
}
2) 创建原生界面布局文件mainmenu.xml,核心代码如下:
android:layout_wideth=“match_parent” android:layout_height=“match_parent” android:orientation=“vertical”
3) 在AndroidManifest文件中设置原生Activity为启动界面。让App的启动界面为Android原生界面,然后跳转到Unity 3D界面。接下来,实现从Unity 3D界面跳转到Android原生界面的功能。
4) 在Unity 3D中创建场景,并添加一个“Back”按钮,如图3所示。
图3 添加“Back”按钮
5) 创建Game.cs脚本,并添加以下代码:
using UnityEngine;
using System.Collections;
public class Game :MonoBehaviour
{
// 点击“Back”按钮时调用
Public void OnBackButtonClick( )
{
using (AndroidJavaClass jc=new AndroidJavaClass(“com.unity3d.player.UnityPlayer”))
{
using (AndroidJavaObject jo=jc.GetStatic
{
//调用Android插件中UnityPlayerActivity的StartActivity( )方法
jo.Call(“BackToMenu”,“msg”);
}
}
}
}
6) 在UnityPlayerActivity中添加BackToMenu函数,在该函数中调用切换界面功能(核心代码如下)。至此,实现了Unity 3D代码与Android原生代码之间的交互功能。
public void BackToMenu(String msg)
{
this.runOnUiThread(new Runnable( )
{
public void run( )
{
//切换至主界面的功能
Intent it=new Intent( );
it.setClass(UnityPlayerActivity.this,MainMenuActivity.class);
UnityPlayerActivity.this.startActivity(it);
}
});
}
2.2Unity3D与iOS原生代码之间的交互
在软件开发实践中,经常会遇到此类问题:在一个使用源生代码开发的iOS应用中需要加入AR的场景功能。不可能在Unity 3D中重新做一遍,这既没有必要也不容易实现,因此需要在iOS原生代码开发的工程中调用Unity 3D中制作好的AR场景,即实现Unity 3D与iOS原生代码之间的相互调用。
实现Unity 3D与iOS原生代码之间的交互功能,需要在iOS原生的工程中加入一个Unity 3D的Vuforia工程,主要的技术流程是:首先在导出Unity 3D工程中设置I12cpp,支持Target iOS Version 8.0,然后根据从Unity 3D导出的Xcode工程,设置Native Xcode 工程,接着将Unity 3D的工程代码导入Native,最后在main.mm方法中改变程序入口,来回切换Unity 3D视图和原生视图[11]。
相对于iOS而言,Android在我国占有更大的市场份额,故本文的研究以Android为主,Unity 3D与iOS原生代码之间具体的交互方法和调用技术不再详述,下一小节将通过一个具体的AR开发实例,论述Unity 3D与Android原生代码之间的交互技术及应用。
3 基于Unity 3D与Android原生代码交互技术的AR开发实例
3.1系统总体设计
本开发实例为基于Unity 3D与Android原生代码交互技术的AR系统。其开发思路是通过图像识别、匹配和Unity 3D交互等技术的应用,处理用户移动设备(如智能手机、平板电脑等)的摄像头所捕捉的真实图像,使其和虚拟的3D物体相结合,最终实现虚实结合的视觉体验效果。本系统的结构见图4[12]。
图4 系统结构
本系统的主要功能通过Unity 3D实现,系统之间的调用即按照2.1小节所阐述的Unity 3D与Android原生代码之间的交互方法来实现。使用调用函数能够在Unity 3D中直接获取智能手机等移动设备的摄像头实例,并获取摄像头拍摄到的图像数据(如图5所示)。
图5 获取图像
3.2 系统开发与实现
本系统采用C#和Java语言为开发语言,基于Android平台,采用Windows XP(或Windows7)操作系统,以C/S作为软件架构,使用的插件有ToolKit2D、NGUI和Vuforia QCAR,使用的主要开发工具有Unity 3D、Eclipse、JDK和Android SDK等。
在开发环境和项目搭建完成后,在本系统的项目中导入待检测的目标对象包,并在.xml文件中保存这些目标图像的信息,核心代码如下[12-14]:
Schema Location=“qcar_config.xsd”>
对ARCamera进行设定后,需匹配的目标图像和检测到目标图像后执行的操作通过ImageTarget设置。最后,用户智能手机终端能显示经过目标的检测、图像匹配与虚实融合的图像数据[12],如图6所示。
通过多角度观测虚实结合效果的实验测试,结果表明:本系统可以成功识别目标图片,并将3D虚拟信息叠加到图片上,当目标图片的位置、角度发生变化时[12],能很好地识别并将虚拟信息融合到真实场景中,且系统运行稳定,效果逼真(如图7所示)。
图6 AR系统场景
图7 AR系统实验测试
4 结束语
当下AR技术还处于发展的起步阶段,大多数AR应用都在智能手机上运行,通过图像识别、匹配及处理等技术实现简单的增强现实效果,其采用的解决方案多是利用Unity 3D等游戏引擎配合AR SDK进行开发,且不可避免地需要灵活应用Unity 3D与Android、iOS原生代码之间的交互技术。下一步工作将深入探讨和实践使用HiAR SDK开发AR应用,使得在Unity 3D引擎中开发的AR应用很容易地移植到Android和iOS平台上。
[1] 黄薇.Unity引擎方式下3D对战型游戏的网络设计与开发[J].现代电子技术,2015,38(23):118-121.
[2] 林一,陈靖,刘越,等.基于心智模型的虚拟现实与增强现实混合式移动导览系统的用户体验设计[J].计算机学报,2015,38(2):408-422.
[3] 上官大堰,黄心渊,孙望舒,等.基于Android平台的Unity 3D网络功能的开发[J].计算机应用与软件,2015,32(8):72-75.
[4] 于意.基于iOS移动平台的Unity 3D幼儿认知游戏的设计与实现[D].北京:北京工业大学,2015.
[5] 李智鹏.基于Unity 3D引擎的空中战机游戏设计与实现[D].长春:吉林大学,2016.
[6] 邓增强,朱铮涛,龙诗军.3D街机游戏系统研究与应用[J].电脑知识与技术,2017,13(3):202-205.
[7] 王涌天,陈靖,程德文.增强现实技术导论[M].北京:科学出版社,2015.
[8] 魏三强,王兵.AR技术在非物质文化遗产及文化旅游业中的应用[J].江汉大学学报(自然科学版),2016,44(4):364-368.
[9] 黄静.虚拟现实技术及其实践教程[M].北京:机械工业出版社,2016.
[10] HU H X,LU L U.Automatic functional testing of Unity 3D game on Android platform[C]//Proceedings of 2016 3rd International Conference on Materials Engineering,Manufacturing Technology and Control (ICMEMTC 2016).Taiyuan,China,[s.n.],2016:1136-1140.
[11] 张克发,赵兴,谢有龙,等.AR与VR开发实战[M].北京:机械工业出版社,2016.
[12] 李洁.基于Android平台的增强现实系统研究与应用[D].保定:河北农业大学,2015.
[13] 魏琴芳,李林乐,张峰,等.一种安卓系统手机恶意软件链接串行联合检测方法[J].重庆邮电大学学报(自然科学版),2017,29(2):251-256.
[14] 马卫.基于Android移动平台的研究[J].计算机仿真,2016,33(1):218-222.
(责任编辑陈 艳)
InteractionTechniquesBetweenUnity3DandNativeCodeinARDevelopment
WEI Sanqiang1,2
(1.Department of Computer and Information, Suzhou Vocational and Technological College, Suzhou 234101, China; 2.School of Information and Control Engineering, China University of Mining and Technology, Xuzhou 221116, China)
In order to solve the interaction between Unity 3D and native code in the process of AR product development, the interaction between Unity 3D and Android native code, Unity 3D and iOS native code is introduced.The application of image recognition, matching and interaction techniques to achieve the visual experience effect of combination of virtuality and reality through an example of AR system development. The experimental results show that the system runs stably and the effect is vivid. Explains the interaction between Unity 3D and native code, which can reasonably solve the interaction between Unity 3D and native code in the process of AR product development.
AR; Unity 3D; Android native code; iOS native code; interaction
2017-06-08
国家自然科学基金资助项目(61572036);安徽省高校省级自然科学基金重点项目(KJ2016A781)
魏三强(1980—),男,安徽宿州人,博士研究生,副教授,主要从事云计算、动漫制作技术、VR与AR技术研究,E-mail:weiwei19801983@163.com。
魏三强. AR开发中的Unity 3D与原生代码交互技术[J].重庆理工大学学报(自然科学),2017(11):166-171.
formatWEI Sanqiang.Interaction Techniques Between Unity 3D and Native Code in AR Development[J].Journal of Chongqing University of Technology(Natural Science),2017(11):166-171.
10.3969/j.issn.1674-8425(z).2017.11.025
TP391
A
1674-8425(2017)11-0166-06