这几天去厦门参加了VALSE2017会议,对于其中某个环节展示的有关增强现实游戏的部分印象深刻。因为前两年一度沉迷于利用各类引擎开发游戏,所以也曾经以Pokemon GO为模板开发过一款多平台增强现实网络游戏,作为当时的校内实习项目,现在好像利用增强现实技术开发游戏已经成为一个流行的方向了,所以就把当时总结报告中的一些内容贴出来,作为一种开发方案,希望能帮助到一些游戏开发者。

开发需求

时下最热门的技术门类中,一定有增强现实的一席之地,增强现实引领着当前人机交互领域的一股新热潮,随着Hololens等增强现实设备的诞生,各大科技巨头也吹响了进军增强现实领域的号角,增强现实技术的热门一方面是因为其在技术上的开拓性思路,更是因为以增强现实技术为基础的应用往往完美地结合了科技性与娱乐性。前段时间非常火爆的Pokemon GO就是一个非常好的例子。通过实际开发来学习、研究增强现实开发技术,将增强现实技术结合到实际应用之中,让用户得到如Pokemon GO般良好的交互体验,就是此项目的开发需求。值得一提的是,在此项目开发前期,由于预想将其输出至Hololens平台,所以我完整阅读、学习了Hololens Academy上的内容,并且完成了DEMO的开发,运用到了Hololens绝大多数关键特性,之后由于机器问题,故转而选择发布到安卓平台,并针对安卓平台进行了开发,目标实现类似于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,谢谢!

利用Unity3D实现多平台增强现实网络游戏的一种方案的更多相关文章

  1. 利用Unity3D制作简易2D计算器

    利用Unity3D制作简易2D计算器 标签(空格分隔): uiniy3D 1. 操作流程 在unity3DD中创建一个新项目 注意选择是2D的(因为默认3D) 在Assets框右键新建C#脚本 在新建 ...

  2. 利用matlab求图像均值和方差的几种方法

    一.求均值 % 求一副灰度图像的均值 close all; clear; clc; i=imread('d:/lena.jpg'); %载入真彩色图像 i=rgb2gray(i); %转换为灰度图 i ...

  3. 利用Selenium实现图片文件上传的两种方式介绍

    在实现UI自动化测试过程中,有一类需求是实现图片上传,这种需求根据开发的实现方式,UI的实现方式也会不同. 一.直接利用Selenium实现 这种方式是最简单的一种实现方式,但是依赖于开发的实现. 当 ...

  4. 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案

    最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...

  5. 利用Unity3D与Oculus实现机器情绪安抚师的一种方案

    (一张最原始的Unity3D中音乐可视化粒子海的图,想象一下,如果这幅场景出现在虚拟设备中,辅以根据音乐频谱变化的色彩与悦动频率,会是怎样的效果呢?) Unity3D有着非常完备的虚拟三维场景交互开发 ...

  6. 细说Unity3D(一)——移动平台动态读取外部文件全解析

    前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑和 ...

  7. Unity3d在各个平台读取Sqlite3数据库

    这也是我第一次在Unity3d中使用Sqlite来作为配置表文件,当然了,SQLite有优秀的读写性能. 如果这个项目用着稳定的话,我会一直使用下去. Android平台: 1,下载libsqlite ...

  8. Unity3D在移动平台下加载AssetBundle导致Shader效果不正确的问题

    这个问题,主要还是在移动平台下开发导致的. 在编辑器里调试加载AB时会导致Shader效果不正确的原因,主要还是编辑器下加载以IOS或是ANDROID平台打包的AB它所使用的shader已经编译成对应 ...

  9. 利用新浪云平台(SAE) 搭建 HUSTOJ 简易教程

    前言: OnlineJudge(OJ)是一种代码在线判定平台,这里有许多的编程题目供你选择,你可以选择题目提交代码,OJ会自动返回你的代码的判定结果.是一种很方便的编程.算法练习平台.详情可见:百度百 ...

随机推荐

  1. 可扩展标记语言XML

    XML简述 XML用于描述数据,是当前处理结构化文档信息的有力工具.与操作系统编程语言的开发平台无关,可以实现不同系统之间的数据交互. 结构 <?xml version="1.0&qu ...

  2. Triangle Problems

    Triangle Problem songxiuhuan 宋修寰 Import the Junit and eclemma Choose the project and right click, ch ...

  3. Contains Duplicate leetcode

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  4. 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7496  Solved: 3078[Submit] ...

  5. C++primer拾遗(第一章:开始)

    本系列将总结正在阅读的C++primer这本书中值得注意又容易忘记的知识点. 1. 当return语句包括一个值时,次返回值的类型必须与函数返回类型相同. 2. 操纵符 endl.写入该符号的效果是: ...

  6. 手机端rem如何适配_rem详解及使用方法

    什么是rem 在我看来,rem就是1rem单位就等于html节点fontsize的像素值.所以改变html节点的fontsize是最为关键的一步.根据手机宽度改变相对大小就可以实现自适应了,就不用什么 ...

  7. kali linux qq 2013

    按照网上的教程折腾了好几个小时,都没有搞定的qq for linux 在意外的尝试中成功了 文章有参考网友教程的部分:http://xiao106347.blog.163.com/blog/stati ...

  8. 使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱

    1.当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的某一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释来精确配置. 2.示例 ...

  9. Unity 3D Framework Designing(1)—— MVVM 模式的设计和实施(Part 1)

    初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Command)等功能,这让 MVVM 模式得到 ...

  10. Unity 3D Framework Designing(2)——使用中介者模式解耦ViewModel之间通信

    当你开发一个客户端应用程序的时候,往往一个单页会包含很多子模块,在不同的平台下,这些子模块又被叫成子View(视图),或者子Component(组件).越是复杂的页面,被切割出来的子模块就越多,子模块 ...