利用Unity3D实现多平台增强现实网络游戏的一种方案
这几天去厦门参加了VALSE2017会议,对于其中某个环节展示的有关增强现实游戏的部分印象深刻。因为前两年一度沉迷于利用各类引擎开发游戏,所以也曾经以Pokemon GO为模板开发过一款多平台增强现实网络游戏,作为当时的校内实习项目,现在好像利用增强现实技术开发游戏已经成为一个流行的方向了,所以就把当时总结报告中的一些内容贴出来,作为一种开发方案,希望能帮助到一些游戏开发者。
开发需求
随着Hololens等增强现实设备的诞生,各大科技巨头吹响了进军增强现实领域的号角,增强现实技术的热门一方面是因为其在技术上的开拓性思路,更是因为以增强现实技术为基础的应用往往完美地结合了科技性与娱乐性。前段时间非常火爆的Pokemon GO就是一个非常好的例子。通过实际开发来学习、研究增强现实开发技术,将增强现实技术结合到实际应用之中,让用户得到如Pokemon GO般良好的交互体验,就是此项目的开发需求。值得一提的是,在此项目开发前期,由于预想将其输出至Hololens平台,所以我完整阅读、学习了Hololens Academy上的内容,开发了一个demo,之后由于机器问题,故转而选择发布到安卓平台,并针对安卓平台进行了开发,目标实现类似于Pokemon GO的游戏交互体验。另外,由于主题是基于增强现实技术的可视化内容智能生成应用,所以我在开发过程中还保证所用到的有关增强现实的技术是可拓展,可移植的,例如需要开发一个以家庭场景为环境的增强现实交互系统,那么就可以直接使用该项目中所使用到的解决方案。
模块设计方案
在本应用的设计架构中,核心是基于增强现实的捕捉收集体验与联网对战,围绕此核心设计了数个模块,包括主界面模块,联网游戏模块,单机游戏模块,图鉴模块,捕捉模块,网络传输模块,装备模块,商城模块。另外在这些模块初步开发完成后,我又进行了对象缓冲池的开发,以期提高运行效率。
设计架构图示如下:
详细技术实现
主界面模块
主界面模块也就是该应用的初始界面,开发上所使用到的技术主要是UGUI技术,同时也有一些非常简单的网络传输技术,用来更新游戏公告栏信息等。
该模块实际运行效果如下:
单机游戏模块
单机游戏模块也就是当玩家选择单机游戏时进入的主界面,这个界面上主要运用到了基于C#的Unity脚本技术,MAYA建模以及UGUI开发技术。
C#脚本主要是用来控制UI中的各类控件的动态更新,以及实现动态背景(背景三维场景实现了随机动态变化以及通过手指移动观看场景的不同区域)。
MAYA建模主要负责搭建场景中的各类模型,例如行星等。
UGUI开发技术主要用来实现该场景中的各类UI。
该模块实际运行效果如下:
商城模块
商城模块主要涉及的是与全局管理代码的交互及UGUI开发,通过与全局管理代码的交互来实现购买功能,通过UGUI来构建一个经典的商城页面,并且活用各类控件美化界面,优化功能。
该模块实际运行效果如下:
图鉴模块&装备模块
图鉴模块及装备模块的技术实现方式与商城类似,这两个模块的实际运行效果如下:
捕捉模块
捕捉模块主要负责的就是实现捕捉游戏中的外星人的功能,具体来说涉及到的就是根据特定的图像智能生成特定的三维模型,这个三维模型是具有增强现实属性的,也就是说,当我们移动摄像头时,三维模型会像实际存在于真实世界那样以自然逼真的方式改变自己在可视化内容中的角度与尺寸,另外,用户还可以通过手指点击,滑动以发射游戏中的太空舱与外星人进行交互,当太空舱与外星人形成碰撞时有概率完成捕捉。
在开发这个模块时,我遇到了一个难题,就是特定图像的识别问题。我使用了一款性能比较优秀的SDK——Vuforia,它可以将识别图片的功能整合进Unity3D应用,并且通过其强大的服务器实时处理传入的图像并返回结果值。
在实现增强现实方面,我所做的工作主要是控制模型的生成,移动,攻击,消失以及当摄像头移动时真实的模型状态变换方式,这些都是通过C#脚本来实现的。
在实现交互方面,主要要实现的就是通过手指的点击与移动来实现太空舱的抛射,控制太空舱的角度与速度,以及撞击外星人时检测碰撞并完成捕捉。
该模块的实际运行效果如下:
联网游戏模块
在这个应用中,联网对战功能也是非常关键的一环,很多时候一款游戏的联网对战功能可以直接决定游戏的娱乐性和竞技性。在本应用中,我主要使用了以下三项技术实现了联网对战的功能:
网络视图(Network View)
网络视图在Unity3D引擎中以组件形式发挥作用,当开发者需要使某个游戏对象成为网络对象(在联网游戏中在每个用户和服务器上都实时更新的对象)时,首先需要为其添加网络视图组件,这是后续开发的基础,通过这个组件衍生出来的功能强大而繁多,几乎可以实现网络游戏所需要的所有网络功能,在本应用中,所有网络对象都含有此组件。
状态同步
网络视图实时收发已经设置为Observed的组件信息,当开发者自定义需要共享的数据或数据组时,就需要在脚本中定义回调函数:OnSerializeNetworkView(),在此函数中开发读写网络数据的各类逻辑,这就是状态同步技术的作用,在本应用中是控制网络数据传输逻辑的核心。
远程过程调用(RPC)
RPC针对的是物理隔绝的不同设备上的函数,使用RPC可以通过网络调用其他玩家脚本中的函数,例如,在一款网络射击类游戏中,玩家在本地调用了开枪函数,那么网络中别的玩家端也应同时调用相应网络对象的开枪函数,这时候就需要使用到RPC了,在本应用中,RPC负责实现开火,动态改变角色动画等保证游戏性的重要功能。
本模块实际运行如下所示:
对象缓冲池
由于该应用的特征,在一些时候,同一场景中会使用大量的模型与各类粒子特效等,这样虽然会使得应用的效果更加精彩,但是同时也必然会导致频繁的创建、克隆、销毁对象,这就很大程度地消耗了大量的计算资源,使得应用出现卡顿现象。这时候在应用开发领域有一种经典的方法:将需要用到的游戏对象与粒子系统等提前加载到一个池中,然后需要的时候再直接从池中取得,用完再放回以便下一次取得,避免使用的时候进行大量重复的克隆工作,影响系统效率,更具体地说,“取得”和“放回”的过程实际上就是对已加载的游戏对象进行启用和禁用的过程。这种方法就是“对象缓冲池”方法。当我将这种技术运用到这个应用的子弹等对象的生成与销毁中时,我发现确实明显提高了应用运行时的流畅性。
全局管理器
全局管理器主要是由C#脚本及其中的静态变量组成,我开发全局管理器的主要目的是使得应用的结构更加清晰,当需要对应用中某些功能进行更改时更加便捷,安全。这也是在实际开发过程中非常常用的一种技术。
以上内容由于主要是利用Unity3D引擎开发游戏,所以代码上没有什么特别难的地方,所以涉及到的一些脚本也暂时就不开源了。这篇文章中所介绍的主要是这种开发方案的框架,由于Unity3D本身支持多平台输出,所以依托这样一个方案就可以开发出一个最基本的类似Pokemon GO的多平台增强现实网络游戏。
备注:本人非常乐意分享我的文章,转载请注明我的博客地址:http://www.cnblogs.com/matthewli/与原文地址:http://www.cnblogs.com/matthewli/p/6759275.html,谢谢!