利用Unity3D实现多平台增强现实网络游戏的一种方案
这几天去厦门参加了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实现多平台增强现实网络游戏的一种方案的更多相关文章
- 利用Unity3D制作简易2D计算器
利用Unity3D制作简易2D计算器 标签(空格分隔): uiniy3D 1. 操作流程 在unity3DD中创建一个新项目 注意选择是2D的(因为默认3D) 在Assets框右键新建C#脚本 在新建 ...
- 利用matlab求图像均值和方差的几种方法
一.求均值 % 求一副灰度图像的均值 close all; clear; clc; i=imread('d:/lena.jpg'); %载入真彩色图像 i=rgb2gray(i); %转换为灰度图 i ...
- 利用Selenium实现图片文件上传的两种方式介绍
在实现UI自动化测试过程中,有一类需求是实现图片上传,这种需求根据开发的实现方式,UI的实现方式也会不同. 一.直接利用Selenium实现 这种方式是最简单的一种实现方式,但是依赖于开发的实现. 当 ...
- 【ARM-Linux开发】【CUDA开发】【视频开发】关于Linux下利用GPU对视频进行硬件加速转码的方案
最近一直在研究Linux下利用GPU进行硬件加速转码的方案,折腾了很久,至今没有找到比较理想的硬加速转码方案.似乎网上讨论这一方案的文章也特别少,这个过程中也进行了各种尝试,遇到很多具体问题,以下便对 ...
- 利用Unity3D与Oculus实现机器情绪安抚师的一种方案
(一张最原始的Unity3D中音乐可视化粒子海的图,想象一下,如果这幅场景出现在虚拟设备中,辅以根据音乐频谱变化的色彩与悦动频率,会是怎样的效果呢?) Unity3D有着非常完备的虚拟三维场景交互开发 ...
- 细说Unity3D(一)——移动平台动态读取外部文件全解析
前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑和 ...
- Unity3d在各个平台读取Sqlite3数据库
这也是我第一次在Unity3d中使用Sqlite来作为配置表文件,当然了,SQLite有优秀的读写性能. 如果这个项目用着稳定的话,我会一直使用下去. Android平台: 1,下载libsqlite ...
- Unity3D在移动平台下加载AssetBundle导致Shader效果不正确的问题
这个问题,主要还是在移动平台下开发导致的. 在编辑器里调试加载AB时会导致Shader效果不正确的原因,主要还是编辑器下加载以IOS或是ANDROID平台打包的AB它所使用的shader已经编译成对应 ...
- 利用新浪云平台(SAE) 搭建 HUSTOJ 简易教程
前言: OnlineJudge(OJ)是一种代码在线判定平台,这里有许多的编程题目供你选择,你可以选择题目提交代码,OJ会自动返回你的代码的判定结果.是一种很方便的编程.算法练习平台.详情可见:百度百 ...
随机推荐
- 基于 Koa平台Node.js开发的KoaHub.js的模板引擎代码
koahub-handlebars koahub-handlebars koahub handlebars templates Installation $ npm install koahub-ha ...
- Markdown语法讲解及MWeb使用教程
写了一个月的博客,忽然感觉Markdown编辑器比较好用,于是就下载了一个本地的Markdown编辑软件学习了一下,刚好软件里自带了一篇英文的指示文档,顺便翻译了一下,通过这个过程也大致熟悉了Mark ...
- Mysql 保留最新的10条数据
Mysql每天执行计划,保留最新的10条数据,其余的删除 1.Mysql 保留最新的10条数据 sql语句: DELETE tb FROM tbname AS tb,( SELECT id FROM ...
- java中的对象
对象 --计算机语言中的对象 通常,我们可以从一般事物的三个方面,去认识事物: 一.是什么? 二.为什么? 三.怎么样? 接下来,我们也利用这三个方面的思维,去 ...
- jQuery kxbdMarquee 无缝滚动
转:http://code.ciaoca.com/jquery/kxbdmarquee/ <marquee> 曾是 IE 下独有的一个走马灯效果的标签,其他浏览器并不兼容,于是出现了使用 ...
- noip2008(最优贸易)
C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道 ...
- 《转载-两篇很好的文章整合》Android中自定义控件
两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs ...
- iOS开发之Info.plist文件
建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 在旧版本Xcode创建的工程中,这个配置 ...
- Zabbix 2.2.x, 3.0.x SQL注射漏洞修复方法
1.漏洞测试 在您的zabbix的地址后面加上如下url: jsrpc.php?type=&method=screen.get×tamp=&pageFile=hist ...
- SharePoint 配置传出电子邮件设置
1. 环境参数说明 A) Windows Server 2012 R2 B) SharePoint 2016 C) 第三方邮件服务器(smtp.3th.com - 有负载均衡,即对应多个IP服务器) ...