问个事哦。广州U3D VR游戏开发创业前景如何前景如何

VR发展史与现在火爆的原因
发表于 12:03|
作者罗志达、张鑫
摘要:本文由MDCC 2015“虚拟现实专场”演讲嘉宾之一罗志达与Unity技术支持经理张鑫共同撰写。旨在让更多投身VR领域的开发者在创建一个VR项目之前,从过去,现在与未来的多重角度来了解VR,以及开发建议。
一年一度的移动开发者盛宴——2015移动开发者大会(简称MDCC 2015)将于10月15日至10月16日在北京新云南皇冠假日酒店隆重召开。MDCC是由CSDN和创新工场联合主办的中国最大的移动开发者盛会,致力于推动中国移动互联网生态系统的成长,今年将迎来第六届。
本届MDCC将以“虚拟现实”这一前沿热点为主题设立“虚拟现实专场”。到场嘉宾来自海外的华人技术创业团队,国内虚拟现实设备研发团队,游戏引擎公司,以及专注于虚拟现实游戏开发的创业新晋团队。他们将围绕硬件交互技术、内容制作与交互探索等话题与现场观众进行交流、分享。
“虚拟现实专场”嘉宾之一罗志达来自Unity,在游戏产业从MMO、页游到手游开发,有13年研发管理经验。他在“虚拟现实专场”的演讲话题为“
基于3D实景信息构建VR虚拟场景”。他曾与同事张鑫共同撰写本文,并
发布在《程序员》杂志9A刊。
在开始了解如何创建一个VR项目之前,首先需要了解VR的一些历史:1935年,小说家Stanley G.Weinbaum在他的小说中描述了一款虚拟现实的眼镜,而该小说被认为是世界上率先提出虚拟现实概念的作品,故事描述的就是以眼镜为基础,包括视觉,嗅觉,触觉等全方位沉浸式体验的虚拟现实概念;1962年,一部名为Sensorama的虚拟现实原形机被Morton
Heilig所研发出来,后来被引用到空军,以虚拟现实的方式进行模拟飞行训练。虽然随后从1970年到1994年的二十多年间,VR领域有许多科学家相继投入研究,但从整体上看,还仅限于相关的技术研究,并没有生产出能交付到使用者手上的产品,直到1994开始,日本游戏公司Sega和任天堂分别针对游戏产业而推出Sega
VR-1和Virtual Boy,在当时的确在业内引起了不小的轰动,但因为设备成本高,普及率并没有很大,但也为VR硬件进军To C市场打开了一扇门。
现今VR产业火爆,起因是因为2012年Oculus Rift通过国外知名众筹网站KickStarter募资到160万美元,后来被Facebook以20亿的天价收购。而当时Unity作为第一个支持Oculus眼镜的引擎,吸引了大批开发者投身VR项目的开发中,正式打响了这场VR之战,但经历首轮引爆后,2014年Google发布了Google
CardBoard,让消费者能以非常低廉的成本通过手机来体验VR世界,导致许多手游开发者纷纷加入这战局,点燃了今日的”Mobile VR”超级大战。
Google Cardboard  
纵观当今市场,基于与Unity一直保持良好关系的硬件公司所讨论出的数据,讨论后所得到的数据,以及独立开发市场分析的结果,2017年会有超过1300万的VR硬件产出,2020年更会超出5000万台,总市值将达30亿美元。
VR原理与现状深度探讨
在当今已经销售的沉浸式VR设备中,主要有以下两种设备类型:
基于PC的头戴式VR设备,如Oculus Rift。此类设备通过PC来计算,并将计算结果传递给头戴式设备中的显示屏进行显示,进而让用户产生沉浸式VR的体验。就目前而言,该类设备较之其他类型设备,可以提供给用户最好的VR体验,但其缺点是必须要通过USB/HDMI线与PC相连,这也极大地限制了该类设备的灵活性。
基于Mobile的头戴式VR设备,如Gear VR,Google Cardboard等。此类设备通过将移动设备进行场景的渲染和计算,并直接作为屏幕来进行显示。该类设备的优点是避免了繁琐的电线连接,便于携带,且移动设备普及率高。但缺点同样突出,即计算和渲染能力较PC相比,逊色许多,且随着体验时间的增加,移动设备的发热程度会迅速上升,从而迫使其降低频率来进行计算,进而造成更大的画面卡顿和延迟,大大降低VR体验的舒适感。
除此之外,还有Sony的Morpheus、HTC的VIVE等硬件设备,据悉也将于明年正式面世。
就目前的VR体验而言,其最亟需解决的问题就是用户体验时的眩晕等身体不适问题。造成身体不适的原因很多,分辨率、画面重影、画面延迟、深度感知不连续等等。人体全身上下有许多感知器官,每时每刻都在不断地感知周围信息并将其传给大脑,大脑则不断对这些信息进行处理,判断其是否正常和“合理”。所以,如果出现了大脑无法识别的冲突信息,大脑就会感到“困扰”,进而产生不适感。以上所说的“重影”、“延迟”和“深度感知不连续”等,均会让大脑感到“困扰”,因为这些现象在人们习以为常的生活中,几乎是不可能出现的。因此,这种情况极大加速了人们大脑的疲劳,甚至出现眩晕恶心等情况,进而大大缩短了VR体验的时间。目前,沉浸式VR的体验时间一般为每次5-10分钟,连续体验不宜超过30分钟。
如何提供给用户更棒的VR体验,已经成了当今VR领域首要的解决问题。就目前而言,主流的硬件厂商都在以下几个方向进行不懈的努力。
提高帧率、降低延迟度
一般来说,一款PC/移动游戏的帧率只需保持在30帧/秒以上,即可满足玩家流畅游戏的需求。但对于沉浸式VR体验来说,30帧/秒是远远不够的。在此,需要先来解释一下延迟度这个概念。
所谓“延迟度”,是指从头戴式设备的传感器将方位信息传入PC机开始,经过PC/移动设备的计算渲染,最后传回到显示屏进行显示的时间间隔,如图1所示。所以,用户眼睛真正看到的实际上是几十毫米之前的场景。
图1:设备延迟度的形成原因。该图取自Nvidia的技术文档《Gameworks VR》
如果延迟度过长,则用户实际看到的渲染场景是“一顿一顿”进行显示的,进而增加了VR体验的不适感,甚至让人感到眩晕。一般来说,延迟度需要小于20ms且越小越好,这样才能保证较好的VR体验。如果想要延迟度小于20ms,则必须要保证帧率至少达到75帧/秒,甚至90帧/秒以上。而这种性能要求,即便是对于目前的主流家用PC机来说,也算的上是“苛刻”了。
虽然Oculus提出了Async Timewarp技术来尽可能在低帧率的情况下保证延迟度,但该方法目前仅能适用于“头部旋转”(Rotation
Timewarp)和小范围慢速度的位置移动(Positional Timewarp)。对于快速移动和动态物体,该方法依然无效,如图2所示。因此,这里需要郑重说明的是,在提高VR体验时,没有任何一种方法比“提高帧率”更为有效。
图2:Async Timewarp方法比较适合与静态场景的显示,但对于动态物体,则会出现“重影”效果,进而造成一定的视觉不适
提升分辨率
目前的硬件需要在距离眼睛很近的位置观看,而屏幕贴近眼睛很容易产生纱窗效应,使眼睛能够看出屏幕中的格点,进而产生不适。坦白说,分辨率问题需要依靠硬件方面的提升才能得以解决。
VR与人体的关系与注意事项
实际上人体对于环境的敏锐度是超乎想像的,一个舒适的VR体验远比一个美观的VR体验更为重要,因为不舒服的体验会导致人体产生强烈的排斥反应,进而造成晕眩或是不适,在目前VR项目的开发原则就是不要让帧率低于75或停止更新。
VR摄像头的结构有如一双眼睛有两个平行绑定的摄像头,且各自拥有独立的校准功能,眼睛往前看的情况下视角(FOV)范围水平角度122°,垂直角度120°,如果是在颈部自由运动的范围下,视角(FOV)能达到水平角度210°,垂直角度160°。有趣的是,如果以每度60x60像素来算,我们认为当屏幕硬件技术进化到12K
x 10K时,VR体验将会非常趋近现实。
VR体验最重要的环节还有声音,但许多开发者忽略了声音的重要性,试想把耳朵塞住看电影,整个体验将完全没有沉浸感,因为人的耳朵掌管许多事情,比如平衡感和声音传递,它们就像是两个心型麦克风,人脑通过声音传递到两只耳朵的强度和时间差计算出声音的方向,分析出这段声音是否需要被注意,进而决定你会选择转头往音源方向看去,还是会选择忽略这段声音。也因为人脑有这样的过滤机制,使得即使在很吵杂的环境里,如果有人叫你的名字,你也会特别容易感知到,这就是有名的”鸡尾酒效应”。
值得一提的是,人的耳朵接受到高频音(3000Hz以上)时会下意识地往上看,而接受到低频音(750Hz以下)时会往下看,因此在制作VR项目时,这都是有利于引导使用者视线走向的好方法。
我们常常提到自己感觉到了速度,,其实那指的是加速度,人体对于加速度是有感的。因此无论是飞机起飞或汽车加速时,你就能感觉到速度快速增加,但人体对于速度本身是感觉不到的,当飞机飞行到稳定速度时,你能在机舱内安稳地用餐而不会觉得飞机正在快速移动,而你现在也无法感觉到地球正在定速转动。
重力感是唯一我们无法欺骗身体的感觉,比如在某个VR项目中过山车翻转了180度,但实际上你的身体清楚地意识到其实你重力还是朝下,这时沉浸感就会降低,除非该项目真的配备了能转180度的座椅在体验时搭配使用。
人体比想像中更容易感到疲倦,因此如果长时间佩带VR设备,不管是眼睛还是手部都很容易产生疲劳感。在项目中,如果你过于频繁地引导玩家改变聚焦距离也很容易使人感到疲倦,因此,我们建议最佳的距离是2M-5M。而以目前的硬件设备的性能来看,最佳的内容体验时间大约是5分钟-10分钟,时间过长人体就会产生疲劳感。其他比如突然晃动镜头,突然停止画面或是帧率过低都会让人体产生不舒服的感觉。
其实人类并非像我们所想的那样,希望从VR体验中得到真实感,或者说对真实感的追求是有限度的,这是因为人的情感系统天生带有移情反应,会把所有虚拟现实世界里的物体和真实世界划上等号。如果在虚拟现实世界里看到一只朝着你摇尾巴的小狗,你会主观地认定它对你没有伤害而降低警觉性,而当你的项目是恐怖游戏时,这种移情反应将会是一个非常好的切入点。给各位举一个有趣的例子,当你去商场买衣服的时候,你会发现假人永远都是没有头或是没有五官的几何图形,如果假人有张人脸反而会令客人产生恐惧感,这是1970年日本机器人专家森政弘,根据Ernst
Jentsch于1906年发表的”恐怖谷心理学”所提出的理论:当人类看到与自己形体相当的假人时会产生正面情感,但是随着假人越接近真实的人类外表与行为时,人们则会突然产生剧烈的排斥与恐惧感,直到假人与正常人类外表与行为完全一致时才会消除这份恐惧感,这样的曲线呈现看起来像是一个山谷,因此称为”恐怖谷理论”。
正因为移情反应,开发恐怖游戏更适合使用真实世界的纹理而非卡通纹理,沉浸在虚拟现实内的玩家看到锋利的刀会不由自主的想要避开,看到熊熊烈火会想要绕开,因为有这样的反应,所以虚拟现实也非常适合用在军事训练上,让士兵习惯在危险的环境中生活。
VR的目前市场分析与硬件介绍
针对当前VR开发的问题,我们可以从几个切入点进行讨论。虽然VR硬件百家争鸣,但目前市场上大概有三种类型的VR硬件设备:
第1种:必须接上电脑的沉浸头戴式设备(HMD),这种设备的代表就是Oculus Rift,其优点在于沉浸体验很好,但由于是有线设备,其有限的移动范围是个障碍,因此特别合适于双脚不需移动的应用。设备本身价格比较昂贵,因此大多都是应用于to
B的领域,现在该设备上的应用大多都是短时间体验,因此非常适合展览或是商业活动展示,但这类活动体验的人数较多,因此如何保持设备的卫生将是个大问题。
第2种:需要自带手机的VR(Mobile VR),现在人手一部手机,因此该类设备只要简单地将纸版折成的可容纳手机的盒子就能体验,代表性的设备有Google
Cardboard及Gear VR或是国内的暴风魔镜,虽然体验没有PC头戴设备好,但由于成本低廉,易于携带,开发应用的流程也是手游开发者所熟悉的,因此今年有大量的开发者投入Mobile
VR的开发行列,进而带动了整个VR市场的发展。
第3种:整合AR技术的新型态体验,进入CR(Cinematic Reality)新领域,要知道市场上总是有往前冲的领头羊,谷歌所推出的Google
Glass就是一个案例,虽然现已成为绝响,但也造就后面的Microsoft Hololens, Magic Leap等新型态眼镜的快速进化。未来眼镜的轻量化,极强的电池续航力将是次世代VR设备的重点,但为了达到眼镜轻量化的效果,代价就是身上必须背着一个用来运算的硬件,如果运行效果能达到预期,我们将踏入次世代VR领域。
除了上述大类之外,也有许多不同的VR装置,比如投影VR或是全息VR。
如何从Unity来开发VR项目
Unity 从5.1开始就把VR SDK集成到引擎内,开发者只要下载最新的Runtime Driver之后,在Unity Player设置内将Virtual
Reality Supported打勾,并把硬件连接上电脑就能直接把项目转为VR项目,默认的摄像头会自动切换成为VR摄像头,通过这样的设置,VR的开发过程将与开发一般手游无异,只有在按下Play按钮时,Game
View的视角才会切为VR双镜头画面
VR项目的优化基于硬件的差异会有不同的考量,但是与手游相比相对容易,在现今的中端手机装置上,我建议保持下列几点守则,以保证项目运行顺畅:
绝对不能降帧
减少物体数量,减少物体曲面
多用静态物体,采用烘焙光照
Draw Call保持100左右
小于100k的三角面
可以采用高解析的纹理来弥补
使用物理引擎来避免CPU消耗过大
采用LOD,遮挡剔除,批次运算
Unity 5.1的Profiling功能已经支持Oculus和Gear VR的直接报告,这意味着只要装置连接或是在同网段下,开发者就能透过Profiler来监控VR项目的效能并进行有效优化。
目前Unity的VR开发技术挑战
传统的VR渲染管线,是使用两个相机按照视距摆放并对场景进行渲染。一般来说,渲染时需要在每个相机中依次遍历场景中需要渲染的物体,即整个场景被渲染了两次,如图3所示。这种做法最为直观简单,但其本身存在较高的性能浪费——同样的场景,近乎一致的相机设置,却进行了两次视域体裁剪(Culling)操作,两遍的图形管线API以及双倍的Drawcall占用。因此,我们在Unity
5.1中针对VR的渲染管线进行了深度优化,比如场景裁剪(Culling)仅做一次,场景中的动态阴影也仅渲染一次等等。同时, Android多线程渲染功能和GPU蒙皮(仅OpenGL
ES 3.0)技术的大力支持,让VR方面的渲染性能得到了较大幅度的提升。
图3:传统的VR渲染管线
接下来的Unity开发计划还会加入更多VR设备相关的API,比如眼球追踪API等。渲染管线也会继续优化,预计5.1之后的渲染管线会有几种走向:
图4:改进后的VR渲染管线
Unity针对VR的未来计划
如前文所提到的,虽然VR硬件厂商如潮水般的涌入市场,但目前仍缺乏一个商业化思维,简单来说就是尚未找到一个能够赚钱的方法,相对于VR,反而AR领域目前还比较能够变现。但VR前景仍被看好,我们也相信随着更多人投身该行业,相应的商业模式也会迅速确立。
在一次与同行的讨论中,大家各抒己见地说出自己内心想做的项目类型,并描述了可能执行的做法,虽然无法涵盖全部领域,但在此提供给各位一个参考:
旅游导览系统
实时視頻串流VR
这几年的科技产业变化突飞猛进,我们对于VR产业是相当乐观的,预测短短几年内我们就能在生活中体验到各种VR或AR项目,以Unity的角度来看,保持技术领先,永远面向开发者,和所有的硬件公司和开发者保持良好互动,为开发者提供一个良好的开发环境来创建出未来优质的VR产品,是我们不会改变的目标。
罗志达:Unity官方讲师,在游戏产业从MMO,&页游到手游开发有13年研发管理经验,身为一个热爱游戏的玩家从游戏机到移动平台,从MUD,EverQuest到Candy&Crush不间断的玩了28年的游戏,加入Unity之后致力于将Unity的各种新技术推广给开发者,也乐意与玩家分享各种游戏经验
张鑫:毕业于浙江大学CAD&CG国家重点实验室并取得理学博士学位。2012年10月加入Unity大中华区,担任开发支持工程师,主要从事与Unity引擎相关的技术研发、支持和培训等工作,2015年成为Unity大中华区技术开发支持经理。有着丰富、全面的Unity开发、使用经验,负责现场培训、现场支持、解决方案研发和现场执行等多项技术支持工作。
将于10月15-16日在北京新云南皇冠假日酒店召开。大会特设五大技术专场:平台与技术iOS、平台与技术Android、产品与设计、游戏开发、企业移动化、虚拟现实专场。此外,大会更是首次举办国内极具权威影响力的IoT技术峰会,特设硬件开发技术与嵌入式开发两大专场。大会将聚集国内最具实力的产品技术团队,与开发者一道进行最前沿的探讨与交流。&
第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章在VR风口时 为何不做VR游戏的5点理由
DOGAME游戏兵工厂
[摘要]无论是PS,XBOX,还是国内各式各样的游戏主机,没有一个是将VR设备打包进去的,更别说PC了。这带来的问题是:用户群体分裂-不是所有买主机的人都有VR设备。VR游戏在国内外的前景会如何? VR设备不像智能手机一样会这么普及,所以VR游戏很大程度上可能不会太“火”。 目前公司主流的3d引擎是U3D, u3d的整个开发和发布流程都已经非常完善了,近两三年像UE4这样的引擎是否有可能取代u3d?在VR风口时,我们怎么看待VR游戏在国内外的前景?1、国内VR的热度偏离实际是不争的事实,在当前像样VR游戏完全不知是什么鬼的时候,这个讨论的热度情况可见一斑。相反,很多正在发生的产业改变却无人讨论。2、硅谷的热度可能比国内还高,但其主要在技术层、应用层,而不是内容层,相比起来虽然也有过热的倾向,但比国内的虚热要靠谱得多。3、就VR本身存在的潜在技术意义而言,热度合情合理,但有待于基础建设的进一步提升。4、即便失败,也不代表毫无意义。web2.0时代有很多失败产品,LBS年代有很多失败产品,网络3d化年代有很多失败产品,social game年代有很多失败产品,移动社交应用有很多失败产品……但踩着这些失败产品,互联网一直在继续发展。5、我们的讨论,似乎总是在占卜某种技术的成败,来期望自己能踩对时代发展的点。这种心态,恐怕和“学那种程序语言好”没什么不同。6、诺基亚做不好的智能手机,苹果不一定做不好。永远不要以当前的发展形态预测两三年甚至更久以后的产业变化。7、建议多了解VR技术,少关心内容制作。8、害怕悲剧重演我的命中命中,越美丽的东西我越不可碰。其实我再去爱惜你又有何用,难道这次我能走过社会主义初级阶段?5大道理为什么没做VR游戏:1. 所有VR设备都不是原装设备无论是PS,XBOX,还是国内各式各样的游戏主机,没有一个是将VR设备打包进去的,更别说PC了。这带来的问题是:用户群体分裂-不是所有买主机的人都有VR设备。乐观的估计一下,比方说PS的新宠PSVR,一年内卖出3百万套,那也连10%都不到,作为游戏开发者,用同样的成本开发游戏给3百万潜在玩家或者4千万潜在玩家,你会怎么选。作为玩家,没有什么游戏吸引我,那我为什么要买VR设备。这是个很矛盾很僵局的情形,结果就是消费者不买VR设备,开发者不开发VR游戏,只剩下做VR设备,技术,平台的在炒这个概念。2.VR做不了所有类型的游戏我们看到过很多体验很棒的VR游戏和demo,比开车的,打飞机的,还有模拟嘿嘿嘿的。这些类型的体验真的很棒,仿佛身临其境游戏世界中。但是大多的游戏类型,VR是做不了的。首先我们先排除了整个2d游戏市场,然后我们再排除了固定视角的游戏,比如说大菠萝,文明,LOL。这样又缩小了VR潜在玩家的范围。这也注定了未来的游戏主机不会把VR设备作为原装设备。另一方面,VR对竞技游戏市场也不是好事。 举个例子,用VR设备打CF会给玩家带来优势,那么没有买(买不起)VR设备的小学生们肯定会骂大街。反过来如果VR设备对CF来说不会给玩家带来优势,那玩家肯定还是用鼠标和屏幕来玩。3.成本贵我并不是说那些类似谷歌Cardboard放手机进去的那种,我是指即将要上市的大厂商推的几个产品PSVR, HTC VIVE, Oculus是最久的,知名度最高的VR厂商,主要是设计给PC游戏,最近发布了Oculus Rift的消费者版的价格:600美刀也就是4000rmb,这可是卖肾价啊!HTC VIVE是HTC和Valve生下来的孩子,目前还不知道价格,但是因为配置比Rift和PS VR都更好,价格预计不会比Rift便宜,PSVR最近的声音也很大,并多次故意漏出售价,看看消费者的反应,几次漏出的价格都是500美刀左右先说说PC上的VR设备,在Steam上1亿个注册用户中,只有4百万用户也就是4%达到了Oculus Rift推荐的电脑配置。PS VR没有这个问题,但是,500美刀的售价是PS4主机的150%并不是说这些厂商想钱想疯了,这都是最尖端的技术,Occulus,PS VR都说他们在VR设备上不会赚一分钱,甚至还亏钱,因此价钱也不会在短期内降低到可接受范围。另外,VR体验的宣传本身也非常昂贵。VR的体验并不能很好的通过电视,或者文字描述来传递给潜在消费者,消费者必须亲自体验过才知道VR有多赞。而目前,潜在消费者也只有通过参加展览的方式体验,而且一台设备一次只能一个人体验。虽然谁用谁知道,用过的都说好,但是这个过程太慢太贵。4.设备碎片化开发者都知道,安卓有畸形百怪的分辨率,高低不等的系统版本,群龙无首的芯片处理器, 开发安卓的应用费劲也费金。VR设备也将碰到同样的问题,分辨率不同,刷新率不同,视野范围不同,等等。这无形中让开发成本提高很多,开发者必须保证在各个设备上的体验都好,不然玩家很有可能给你个差评,说你的游戏在某某VR设备上体验不好。VR是体验,它不像安卓有测试机构帮你测试,VR的体验一定要开发者亲自去修改调整才行。5.概念大过实际重度的 要知道,Oculus是在2012年8月众筹成功的,当时有各种预测,比如2014将是VR元年,2015VR要普及。导致很多人跟风跳进VR的“蓝海”,把全部资源投进去做VR游戏的,现在已经挂了一批了。碎片化 - 现在有数不清的公司跳进了VR设备的大海中,想在下一个蓝海中捞一份市场份额期望越高,失望越高-很多人体验过VR的Demo之后都在想象他们心中的VR游戏是怎样的,这就跟和网友谈恋爱一样,见光死是最普遍的结局。市场急躁VR技术不成熟,硬件性能跟不上,软件以及内容不足的情况下就强推,导致真正体验还不错的产品价格太昂贵,便宜的产品体验太差。两者对这个市场都不是好事。
正文已结束,您可以按alt+4进行评论
相关搜索:
[责任编辑:aniszhou]
热门搜索:
Copyright & 1998 - 2017 Tencent. All Rights Reservedunity3d 能不能做vr游戏
unity3d 能不能做vr游戏
你还没有登录,请先登录或注册慕课网帐号
当然可以,unity做vr/ar很好用
你还没有登录,请先登录或注册慕课网帐号
u3d和ue4这两款引擎都可以做vr软件开发
不同的是 u3d必须熟练c#语言
ue4需要熟练操作c+
+语言 如有不同意见的伙伴 或者有需要共同探讨的小伙伴们可以加我qq9862847
你还没有登录,请先登录或注册慕课网帐号
1,可以,如:HTCvive。2,下载Steam,安装对应的驱动。3,在官方AssetStore中下载SDK。4,开发游戏。
你还没有登录,请先登录或注册慕课网帐号
你还没有登录,请先登录或注册慕课网帐号
绝对可以哦
你还没有登录,请先登录或注册慕课网帐号
不只是可以做而已,基本上用unity做vr和ar已经成为了主流,相信慕课也会在不久推出此类课程,共同期待哦
你还没有登录,请先登录或注册慕课网帐号
3698人关注
Copyright (C)
All Rights Reserved | 京ICP备 号-2不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列2 - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"contributes":[{"sourceColumn":{"lastUpdated":,"description":"Learning by Playing,游戏改变学习,让k12青少年爱上编程。","permission":"COLUMN_PUBLIC","memberId":10925,"contributePermission":"COLUMN_PUBLIC","translatedCommentPermission":"all","canManage":true,"intro":"Learning by Playing,游戏改变…","urlToken":"kidscoding","id":602,"imagePath":"f9a1d3e049.jpeg","slug":"kidscoding","applyReason":"","name":"笨猫快乐学编程","title":"笨猫快乐学编程","url":"/kidscoding","commentPermission":"COLUMN_ALL_CAN_COMMENT","canPost":true,"created":,"state":"COLUMN_NORMAL","followers":7660,"avatar":{"id":"f9a1d3e049","template":"/{id}_{size}.jpeg"},"activateAuthorRequested":false,"following":false,"imageUrl":"/f9a1d3e049_l.jpeg","articlesCount":88},"state":"accepted","targetPost":{"titleImage":"/fa920c8a5a3bf4dc582c_r.jpg","lastUpdated":,"imagePath":"fa920c8a5a3bf4dc582c.jpg","permission":"ARTICLE_PUBLIC","topics":[],"summary":"欢迎继续我们的学习。北京时间日凌晨,Oculus正式开放对首款消费版Rift产品CV1的预订。599刀的价格让很多VR粉丝心头一紧,不过想想第一代iPhone的价格也是这样,只能期待后续的版本降价了。筑基为了准备好学习使用Unity开发VR应用,我们首先要检…","copyPermission":"ARTICLE_COPYABLE","translatedCommentPermission":"all","likes":0,"origAuthorId":10925,"publishedTime":"T17:13:46+08:00","sourceUrl":"","urlToken":,"id":376956,"withContent":false,"slug":,"bigTitleImage":false,"title":"不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列2","url":"/p/","commentPermission":"ARTICLE_ALL_CAN_COMMENT","snapshotUrl":"","created":,"comments":0,"columnId":602,"content":"","parentId":0,"state":"ARTICLE_PUBLISHED","imageUrl":"/fa920c8a5a3bf4dc582c_r.jpg","author":{"bio":"Apple,SF,Psychology","isFollowing":false,"hash":"4c9dd7ce259e3e6ae2f0fa6ca42801ee","uid":00,"isOrg":false,"slug":"eseedo","isFollowed":false,"description":"Create a world like Caprica.","name":"王寒","profileUrl":"/people/eseedo","avatar":{"id":"7dd67dbfe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"memberId":10925,"excerptTitle":"","voteType":"ARTICLE_VOTE_CLEAR"},"id":317783}],"title":"不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列2","author":"eseedo","content":"欢迎继续我们的学习。北京时间日凌晨,Oculus正式开放对首款消费版Rift产品CV1的预订。599刀的价格让很多VR粉丝心头一紧,不过想想第一代iPhone的价格也是这样,只能期待后续的版本降价了。筑基为了准备好学习使用Unity开发VR应用,我们首先要检查下自己的电脑硬件和软件配置是否满足要求。简单来说,显卡要NVIDIA GTX970或AMD290以上,CPU要Intel i5-459以上,内存8GB以上,要有两个USB3.0接口,一个USB2.0接口,一个HDMI 1.3接口。操作系统比较坑爹,不支持Mac,也不支持Linux。支持Win7,Win8,Win10。当然,还要把自己的显卡驱动升级到最新版本。Oculus官方的检测地址:关于电脑配置的相关信息,可以参考:一旦完成了这种烧钱的工作,就该安装Unity了。注意在打开Unity前要把DK2连接好并开启。 在继续之前,打开Oculus Configuration Utility应用,并检查Demo Scene可以正常运行。注意在运行Demo Scene之前看可能需要在Oculus Configuration Utility中设置一个新用户。创建第一个VR项目接下来我们将使用Unity创建一个简单的VR项目demo,其效果是在VR头盔中观察一个立方体。如果你想研究更多VR示例,不妨下载我们在上一篇教程中提到的VR示例项目()。Step 1.打开Unity,创建一个新的空项目。说明一下,我当前用的Unity版本是5.3.1f1,可能你看到这篇教程的时候又已经升级换代了。Step 2.在Unity的菜单中选择Fiel- Build Settings,并选中PC,Mac& Linux StandaloneStep 3.在场景中创建一个新的立方体,从菜单中选择Game Object - 3D Object -Cube ,通过Translate工具把立方体放到默认的Main Camera 前面,类似下面。Step 4.保存界面(File- Save Scene,或是使用快捷键)。Step 5.在菜单中选择Edit- Project Settings - Player,在”Other Settings“部分勾选”Virtual Reality Supported”Step 6.点击Unity界面上的Play按钮进入Play模式。如果之前的设置没有问题,现在你应该可以通过DK2看到这个场景,四处看看,Unity中的摄像机将自动根据DK2的位置和旋转变化反应。出错了怎么办?如果你没有在DK2中看到期望的场景,那么检查以下的事项:1.确保你在打开Unity项目前就已经把DK2接好并且开启了。2.打开Oculus自带的Oculus Configuration Utility,看看Demo Scene是不是可以正常运作3.更新你的显卡驱动到最新版本4.确保你在电脑上装了最新的Oculus Runtime 0.8,或更高版本。当然,如果还是有问题,可以到论坛里面参与讨论。关于VR开发的一些有用信息:虽然VR应用开发和标准Unity应用开发很相似,不过还是有些区别需要注意的。1.编辑器中显示的帧速(Frame rate)当你通过编辑器查看项目时,注意体验上可能有些延迟,因为电脑需要将同样的内容渲染两次。所以在实际测试项目的时候,最好创建一个可执行版本,在测试设备上实际体验。2.摄像机的移动注意,我们不能在Unity中直接移动VR摄像机。如果你希望调整摄像机的位置和旋转,需要确保将它设置为其它游戏物体GameObject的子物体,然后通过所依附的物体进行移动。关于这一点,可以查看VR Samples项目中的Flyer和Maze场景。3.相机节点左眼和右眼的摄像机并不是由Unity创建的。如果你在开发中需要获取这些节点的位置,则必须使用InputTracking类。如果你想要获取场景中眼睛的不同位置(比如测试时),请使用下面的示例脚本,并将其attach到摄像机上。C#脚本using UnityEusing UnityEngine.VR;public class UpdateEyeAnchors : MonoBehaviour{
GameObject[] eyes = new GameObject[2];
string[] eyeAnchorNames ={ \"LeftEyeAnchor\", \"RightEyeAnchor\" };void Update()
for (int i = 0; i & 2; ++i)
// If the eye anchor is no longer a child of us, don't use it
if (eyes[i] != null && eyes[i].transform.parent != transform)
// If we don't have an eye anchor, try to find one or create one
if (eyes[i] == null)
Transform t = transform.Find(eyeAnchorNames[i]);
eyes[i] = t.gameO
if (eyes[i] == null)
eyes[i] = new GameObject(eyeAnchorNames[i]);
eyes[i].transform.parent = gameObject.
// Update the eye transform
eyes[i].transform.localPosition = InputTracking.GetLocalPosition((VRNode)i);
eyes[i].transform.localRotation = InputTracking.GetLocalRotation((VRNode)i);
}}4.VR中的图像效果(Image Effect)在VR项目中使用众多图像效果是很奢侈的事情。考虑到你需要两次渲染同一个场景(每只眼睛一次),因此很多当前经常使用的图像效果对VR应用来说会很浪费,会严重影响游戏的运行帧速。因为VR将用户的眼睛置入一个虚拟的空间,因此部分图像效果对VR来说没有任何意义。举例来说,深度视角、模糊效应和镜头光晕效果对VR来说没有任何意义,因为在现实世界中我们是看不到这些效果的。不过如果以后VR头戴设备可以支持眼动跟踪,那么深度视角可能会有意义。不过有些效果还是可以考虑使用的:比如抗锯齿是有用的(特别是考虑到某些头戴设备的低分辨率),色彩分级也很有用(关于这一点可以查看这个链接: ),对有些游戏来说Bloom会有用。不过在使用任何效果之前,最好先在游戏中实际测试下有没有用。Unity自身提供了很多图像效果(Assets-Import Package-Effects),此外Asset Store里面也提供了很多效果,比如Colorful,Chromatica,Amplify Color,还有更多。5.Render Scale根据VR互动应用场景的复杂度和所运行的硬件环境,你可能需要更改render scale设置。通过此项设置可以调整镜头校正前texel:pixel的比率,这样可以牺牲游戏性能来换取画面的清晰度。这项设置应该通过代码进行,可以参考这里:通过使用以下代码可以改变render scale的设置:using UnityEusing System.Cusing UnityEngine.VR;namespace VRStandardAssets.Examples{
public class ExampleRenderScale : MonoBehaviour
[SerializeField] private float m_RenderScale = 1f;
//The render scale. Higher numbers = better quality, but trades performance
void Start ()
VRSettings.renderScale = m_RenderS
}}关于这项设置,可以参考我们的VR Samples,具体示例是Scenes/Examples/RenderScale场景。此外在MainMenu场景中也有该项设置的应用。更改render scale的效果示例如下:Unity的默认render scale是1.0,效果如下:如果将render scale设置成1.5,可以看到显示效果更锐利:接下来把renderscale设置成0.5,可以看到像素化很严重:根据游戏场景的不同,可以考虑降低render scale来提升游戏运行性能,或者通过增加render scale的数值让画面效果更锐利,但会以牺牲游戏运行性能作为代价。好了,看到这里,你应该知道如何在Unity项目中整合VR,如何设置游戏中摄像机的移动,以及和非VR游戏相比应该如何使用图像效果。在下一篇教程中,我们将学习如何跟场景中的物体进行交互,敬请期待~","updated":"T09:13:46.000Z","canComment":false,"commentPermission":"anyone","commentCount":13,"collapsedCount":0,"likeCount":28,"state":"published","isLiked":false,"slug":"","lastestTipjarors":[],"isTitleImageFullScreen":false,"rating":"none","titleImage":"/fa920c8a5a3bf4dc582c_r.jpg","links":{"comments":"/api/posts//comments"},"reviewers":[],"topics":[],"adminClosedComment":false,"titleImageSize":{"width":700,"height":467},"href":"/api/posts/","excerptTitle":"","column":{"slug":"kidscoding","name":"笨猫快乐学编程"},"tipjarState":"activated","tipjarTagLine":"真诚赞赏,手留余香","sourceUrl":"","pageCommentsCount":13,"tipjarorCount":0,"annotationAction":[],"hasPublishingDraft":false,"snapshotUrl":"","publishedTime":"T17:13:46+08:00","url":"/p/","lastestLikers":[{"bio":"设计师","isFollowing":false,"hash":"b05393afc5c4a3c7cf323e","uid":092100,"isOrg":false,"slug":"bridge9907","isFollowed":false,"description":"","name":"bridge9907","profileUrl":"/people/bridge9907","avatar":{"id":"da8e974dc","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"想做策划的程序员","isFollowing":false,"hash":"c00a35f71a8e24cf201b2e0a4dc6dfde","uid":477500,"isOrg":false,"slug":"wang-xi-zhuo-31","isFollowed":false,"description":"看过很多故事,才知道故事就真的只是故事。","name":"屋檐下的猪","profileUrl":"/people/wang-xi-zhuo-31","avatar":{"id":"v2-e62fafaeda4fc8f79cdd4","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"Enable WITH_OPENGL=YES flag when building OpenCV to enable OpenGL support","isFollowing":false,"hash":"be61aefefd1dd6","uid":264200,"isOrg":false,"slug":"tmac-99","isFollowed":false,"description":"","name":"tmac","profileUrl":"/people/tmac-99","avatar":{"id":"b336c835d86fcebc5c6c9","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"来学习的","isFollowing":false,"hash":"c72e1cdd38dbe2","uid":20,"isOrg":false,"slug":"diego-zhang-21","isFollowed":false,"description":"","name":"Diego Zhang","profileUrl":"/people/diego-zhang-21","avatar":{"id":"eceb939e1fd2d7","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"认真严谨,知之答之。","isFollowing":false,"hash":"2b6b0a3c356a59ca107cbd573be3a92f","uid":20,"isOrg":false,"slug":"liang-rui-ta","isFollowed":false,"description":"俗人一个。","name":"梁瑞她","profileUrl":"/people/liang-rui-ta","avatar":{"id":"a09ba9469","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false}],"summary":"欢迎继续我们的学习。北京时间日凌晨,Oculus正式开放对首款消费版Rift产品CV1的预订。599刀的价格让很多VR粉丝心头一紧,不过想想第一代iPhone的价格也是这样,只能期待后续的版本降价了。筑基为了准备好学习使用Unity开发VR应用,我们首先要检…","reviewingCommentsCount":0,"meta":{"previous":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/50/92c0ed196ef08aed32b01_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"Apple,SF,Psychology","isFollowing":false,"hash":"4c9dd7ce259e3e6ae2f0fa6ca42801ee","uid":00,"isOrg":false,"slug":"eseedo","isFollowed":false,"description":"Create a world like Caprica.","name":"王寒","profileUrl":"/people/eseedo","avatar":{"id":"7dd67dbfe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"kidscoding","name":"笨猫快乐学编程"},"content":"如果你不是VR游戏或应用的开发者,可以选择无视下面的内容,这不是给普通用户看的~如果你之前曾经为Oculus Rift DK2或者Gear VR开发过,那么心里面一定曾经有千万个草泥马来回奔跑过。虽然Unity从5.1版本开始就支持VR应用和游戏开发,但是从Oculus和Unity双方的开发者论坛讨论情况看,大家都对双方互相推诿责任感到不满。如今,随着第一代消费级移动VR产品Samsung Gear VR正式推向市场,而三大核心主力设备也将悉数于2016年Q1和Q2粉墨登场,一向与时俱进的Unity再也坐不住了。就在今天,Unity官方在推出5.3版本的同时也推出了首个官方的VR开发教程。虽然不是很详细,但是对于苦逼了很久的开发者来说,简直就是仙音佛乐。废话少说,让我们来一起看看吧。PART I UNITY VR简介Unity内置对若干VR设备的支持,至于具体是哪些设备,不妨看看VRDeviceType这个枚举变量。本教程主要针对Oculus系列的VR设备,特别是Oculus Rift Development Kit 2(DK2)和消费者版本的Samsung Gear VR(需要配合三星旗舰手机系列使用,如Galaxy S6, S6 Edge,S6 Edge+,Note 5)。对于配合第一代开拓者版本Gear VR的Note4,我们并不关心。因此虽然有些VR示例还是可以在这台设备上运行,但是效果肯定没那么好。哥,你就明说不要用note4和开拓者版本的gear vr好了。当然,Unity也会在后续支持其它VR头戴设备,比如HTC VIVE。因此当那一天到来的时刻,这篇官方的教程也会随之更新的。老实说,Unity和Oculus真是一对好基友。如果想了解VR头戴设备的更多信息,建议去阅读官方的手册。PART II 在Unity项目中设置VR首先请下载最新的Oculus runtime 0.8或更高版本( ),以及最新的Unity5.3或更高版本( )。在项目中启用对VR的支持废除简单,只需要在Unity菜单中选择Edit & Project Settings& Player & Other Settings & Rendering然后在Inspector中勾选”Virtual Reality Supported“。在runtime时,可以通过在代码中使用UnityEngine.VR.VRSettings.enabled属性来进行设置。PART III 在Unity中预览VR场景当我们在Unity Editor中已经启用VR Support,而且连接上了DK2设备时,进入Play 模式就可以在DK2上显示游戏的场景。这样可以大大提高开发测试和迭代的效率。和之前不同,开发者无需编译生成一个可执行的项目才能看到VR应用或游戏的调整。当然,老司机们会发现此前的双眼视图已经被单一视图替代了。需要提醒大家的是,我们没必要为每只眼睛都创建一个camera,所有的camera都会在VR中进行渲染,除了那些分配了Render Texture(渲染纹理)的摄像机。关于Render Textures,请参考这里( )。Unity会自动对摄像机的渲染进行优化,比如culling(剔除)和阴影渲染,从而减少性能消耗。关于VR的相关主题还可以在Unity Manual( )和Unity Scripting API( ) 和中找到更多信息。PART IV 使用Unity进行VR开发的软硬件推荐因为VR是一个全新的媒介,所以在撰写本教程的时候存在着软硬件的限制,请参考以下内容。1.硬件为了让用户获得好的VR游戏体验,需要在头戴设备上实现所需的帧速。在DK2上的最小帧速是75fps,而在Gear VR上的最小帧速是60fps。如果帧速小于以上数值,那么用户会明显感觉到体验下降甚至导致晕眩。除了保持游戏帧速在一定的数值之上,玩家电脑上的GPU还必须具备足够的能力,可以按所需的分辨率以HMD头戴设备面板的刷新率输出。以DK2为例,就是需要做到75hz和。不过如果你想给Oculus Rift CV1开发应用,那么就必须实现90hz和的分辨率,这将是个巨大的挑战。如果你在使用DK2,那么需要确保硬件设备可以用所需的分辨率以所需的刷新率输出图像。很多笔记本电脑采用独立显卡和集成显卡切换的方式,但这些显卡基本上都无法满足以上要求,甚至连和75hz都实现不了,这样将严重影响用户体验。关于这部分内容,请参考Oculus的相关文档( ),以及Oculus PC配置指南( )。个人建议是:自己配一个高性能的PC,价格估计在1W2左右。2.软件苹果OS X操作系统:目前来说我们还是可以使用OSX 10.9以上的操作系统配合Oculus 0.0.5 runtime进行开发。但因为Oculus官方暂停了对OS X系统的支持,因此建议果粉们不要拍砖,还是老老实实用Windows系统,并使用Unity的原生VR功能。Windows: 支持Windows 7,8,8.1和windows 10.Android: 推荐使用android OS Lollipop 5.1或更高版本显卡驱动:请确保你的显卡驱动是最新的。可以使用Oculus Configuration Utility来检查显卡驱动是否够用。Oculus Runtime:为了在Unity 5.3中进行VR开发,请使用Oculus Runtime 0.8或更高版本。PART V VR示例项目作为本教程的一部分,我们在Asset Store上免费提供了一个VR示例项目。该项目可以同时支持DK2和Gear VR,我们将根据Oculus硬件的迭代不断更新该示例项目,同时也会在将来考虑支持其它头戴设备。该示例项目的下载链接如下:1.示例场景主要的示例场景包括:(1)Intro: 介绍场景,教用户学习基本的交互(2)Menu:菜单场景,可以选择迷你游戏来玩(3)Flyer:一个飞行小游戏(4)Maze:一个桌面迷宫游戏(5)Target Gallery:一个回廊射击游戏(6)Target Arena:一个360度射击竞技场游戏怎么样,Unity还是很厚道的吧?除了这些完整的小游戏之外,还有一些示例场景涵盖了本教程的一些重要概念:(1)InteractiveItem:演示了如何VR中和物体进行交互(2)RenderScale:演示了RenderScale将如何影响图像质量(3)Reticle: VR中 reticle的基本示例(4)Rotation:演示了物体将如何随头部运动做出响应(5)Touchpad:演示了如何使用Gear VR的触摸板进行交互。所涵盖的重要概念:(1)自顶向下的桌面游戏机制(2)朝屏幕内的星际火狐风格的射击游戏机制(3)回廊射击游戏机制(4)360度回廊射击游戏机制(5)如何在VR中设计界面(6)如何设计立体界面(7)在VR中和物体进行交互的基本框架,包括如何处理视线焦点的切换(8)reticle运动、缩放、阴影等(9)基于头部旋转的运动(10)如何使用Gear VR触摸屏,包括轻击、双击和滑动,或是在使用DK2时如何使用键盘鼠标进行交互。(11)如何判断设备时Gear VR还是DK2(12)如何在围绕中心点旋转摄像机时避免晕眩效应(13)如何实现摄像机的消隐(14)摄像机消隐的过渡(15)Object pooling(不知道咋翻译好)除了提供这些概念之外,为了方便VR开发者的重用,我们还提供了其它一些有用的示例:(1)摄像机的消隐(2)摄像机消隐的过渡(3)在VR中和物体进行交互的框架(4)Hold以确认交互(5)reticle运动和缩放(6)和平台无关的文本(7)指示特定方向的UI箭头(8)移动UI元素,使其始终面向摄像机(9)交互时倾斜UI物体。为了运行本项目,开发者需要使用Unity5.3.0或以上版本,拥有推荐配置以上的软硬件,拥有一台DK2或是搭配合适三星手机的Gear VR,同时要下载Oculus Runtime 0.8或以上版本。PART VI Oculus Unity Utilities作为补充,你也可以下载Oculus官方提供的Oculus Unity Utilities( )来实现一些特殊功能。其中包含了有用的脚本和预设,比如如何调整IPD(瞳间距)等等。本教程只关注原生Unity VR开发,因此对Oculus Unity Utilities,请参考Oculus官方网站以获取更多信息。( )好了,现在你已经知道自己需要哪些东西了。第一篇教程到此结束,在后续的时间里面我们将进一步学习如何开始VR开发。","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T10:46:38+08:00","url":"/p/","title":"不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列1买买买","summary":"如果你不是VR游戏或应用的开发者,可以选择无视下面的内容,这不是给普通用户看的~如果你之前曾经为Oculus Rift DK2或者Gear VR开发过,那么心里面一定曾经有千万个草泥马来回奔跑过。虽然Unity从5.1版本开始就支持VR应用和游戏开发,但是从Oculus和Unity双…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":7,"likesCount":43},"next":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/50/7ad35cf7b1ad7a9a8ba410_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"Apple,SF,Psychology","isFollowing":false,"hash":"4c9dd7ce259e3e6ae2f0fa6ca42801ee","uid":00,"isOrg":false,"slug":"eseedo","isFollowed":false,"description":"Create a world like Caprica.","name":"王寒","profileUrl":"/people/eseedo","avatar":{"id":"7dd67dbfe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"kidscoding","name":"笨猫快乐学编程"},"content":"概览:在VR项目中,我们需要在用户”凝视“某个物体时将其激活。在VRSamples中,我们构建了一个简单的,可拓展的轻度系统,让用户跟场景中的物体进行交互。其中包含了三个主要的脚本文件:VREyeRaycaster,VRInput和VRInteractiveItem,下面将对这三个重要的类进行简要的介绍。相关的源代码也做了注释。VREyeRaycaster该脚本需要和Main Camera关联。在每次调用Update()时,该脚本都会使用Physics.Raycast来投射一条射线,以确认该射线是否命中任何collider(碰撞体)。使用该脚本还可以排除特定的-在某些场景中,我们可能为了性能考虑,把所有的可交互对象移到一个单独的层。如果某个碰撞体被射线命中,那么该脚本将尝试在GameObject上找到一个VRInteractiveItem组件。C#脚本:VRInteractiveItem interactible = hit.collider.GetComponent&VRInteractiveItem&();
//attempt to get the VRInteractiveItem on the hit object从这里我们就可以判断用户究竟在”凝视“哪个物体,或是停止”凝视“某个物体。如果用户开始或停止”凝视“某个物体,那么我们就可以进行一些处理,比如调用一个方法。VRInputVRInput是个简单的类,可以判断用户在GearVR上(或是使用DK2时在PC上)所进行的一些简单操作,比如滑动、触碰、或双触。我们可以直接在VRInput上订阅事件:C#脚本:public event Action&SwipeDirection& OnS
// Called every frame passing in the swipe, including if there is no swipe.public event Action OnC
// Called when Fire1 is released and it's not a double click.public event Action OnD
// Called when Fire1 is pressed.public event Action OnUp;
// Called when Fire1 is released.public event Action OnDoubleC
// Called when a double click is detected.public event Action OnC
// Called when Cancel is pressed.关于订阅事件的更多信息,请参考这里。VRInteractiveItem我们可以把该组件添加到任何希望在VR场景中进行交互的GameObject上,在该物体上需要绑定一个碰撞体。对此我们可以选择订阅六种不同的事件:C#脚本:public event Action OnO
// Called when the gaze moves over this objectpublic event Action OnO
// Called when the gaze leaves this objectpublic event Action OnC
// Called when click input is detected whilst the gaze is over this object.public event Action OnDoubleC
// Called when double click input is detected whilst the gaze is over this object.public event Action OnUp;
// Called when Fire1 is released whilst the gaze is over this object.public event Action OnD
// Called when Fire1 is pressed whilst the gaze is over this object.此外还有一个布尔值用于判断用户是否”凝视“在当前物体上?C#脚本:public bool IsOver{
get{ return m_IsO }
// Is the gaze currently over this object?}我们也可以创建自己的脚本对以上事件作出响应。下面是一个简单的示例:C#脚本:using UnityEusing VRStandardAssets.Unamespace VRStandardAssets.Examples{
// This script is a simple example of how an interactive item can
// be used to change things on gameobjects by handling events.
public class ExampleInteractiveItem : MonoBehaviour
[SerializeField] private Material m_NormalM
[SerializeField] private Material m_OverM
[SerializeField] private Material m_ClickedM
[SerializeField] private Material m_DoubleClickedM
[SerializeField] private VRInteractiveItem m_InteractiveI
[SerializeField] private Renderer m_R
private void Awake ()
m_Renderer.material = m_NormalM
}如果想看到实际的示例,不妨看看VRSampleScens/Scens/Examples/的InteractiveItem场景。SelectionRadial和SelectionSlider我们同时利用了radial选择条(SelectionRadial),以及选择滑动条(SelectionSlider),这样用户就可以按住Fire1来确认某个交互:当按住输入键时,选择条会进行填充,并在填充完整后分发OnSelectionComplete或OnBarFilled事件。关于此部分的代码,可以在SelectionRadial.cs和SelectionSlider.cs中找到,并进行了详细的注释。在VR的世界里,从用户交互的角度看,用户需要时刻知道自己在做什么,而且可以掌控一切。通过这种“held input”的确认输入方式,可以确保用户不会出现误操作。VR Sample项目中的交互示例现在让我们来一起看看VR Sample项目中的部分交互示例。我们将提到每个场景中所使用的交互方式,以及具体实现的方式。Menu 场景中的交互每个menu场景都包含了几个组件,其中我们需要重点关注的是MenuButton,VRInteractiveItem和Mesh Collider。MenuButton组件订阅了VRInteractiveItem组件上的OnOver和OnOut事件,这样当十字准星移到menu上时,selection radial会出现。当用户的实现离开菜单选项时,selection radial会消失。而当selection radial可见,且用户按住Fire1键时,则radial会自动填充:该类还订阅了OnSelectionRadial的OnSelectionComplete事件,这样当radial被填充满的时候,会调用HandleSelectionComplete。该方法的作用是让摄像机淡出,并调用所选的关卡。C#脚本:private void OnEnable (){
m_InteractiveItem.OnOver += HandleO
m_InteractiveItem.OnOut += HandleO
m_SelectionRadial.OnSelectionComplete += HandleSelectionC}private void OnDisable (){
m_InteractiveItem.OnOver -= HandleO
m_InteractiveItem.OnOut -= HandleO
m_SelectionRadial.OnSelectionComplete -= HandleSelectionC}private void HandleOver(){
// When the user looks at the rendering of the scene, show the radial.
m_SelectionRadial.Show();
m_GazeOver =}private void HandleOut(){
// When the user looks away from the rendering of the scene, hide the radial.
m_SelectionRadial.Hide();
m_GazeOver =}private void HandleSelectionComplete(){
// If the user is looking at the rendering of the scene when the radial's selection finishes, activate the button.
if(m_GazeOver)
StartCoroutine (ActivateButton());}private IEnumerator ActivateButton(){
// If the camera is already fading, ignore.
if (m_CameraFade.IsFading)
// If anything is subscribed to the OnButtonSelected event, call it.
if (OnButtonSelected != null)
OnButtonSelected(this);
// Wait for the camera to fade out.
yield return StartCoroutine(m_CameraFade.BeginFadeOut(true));
// Load the level.
SceneManager.LoadScene(m_SceneToLoad, LoadSceneMode.Single);}让我们来看看Selection Radial的部分示例,注意截图中间的粉色元素:Reticle only当用户“凝视”菜单选项时,空白的Selection Radial可见。Selection Radial 填充(当用户“凝视”菜单选项,且按下fire1输入键)在整个示例项目中,我们尝试用同样的风格,也就是使用bar和radial以固定的速度进行填充。在此建议大家在开发自己的VR项目时注意到这一点,因为交互设计中的连贯性对用户很重要,特别是对于VR这种新媒介。Maze场景中的交互Maze(迷宫)游戏中提供了一个桌面式的交互示例,其中我们可以指引游戏角色到出口,并避免触发炮塔。在选择角色的目的地时,会出现一个目的地标记,同时还会显示一个角色的路径。玩家可以通过在触摸板上使用swipe,按下方向键,或是使用游戏操纵杆上的左键来旋转视图。在MazeFloor游戏对象上关联了MeshCollider和VRInteractiveItem,从而允许在VR场景中进行交互:MazeCourse 游戏对象是一个parent对象,其中包含了MazeFloor和MazeWalls GameObjects,这两个对象依次包含了迷宫布局中的几何信息。MazeCourse关联了一个MazeTargetSetting脚本,其中包含了对MazeFloor对象上VRInteractiveItem组件的引用。MazeTargetSetting订阅了VRInteractiveItem上的OnDoubleClick事件,随后会分发OnTargetSet事件。该事件将把十字准星的Transform作为参数:C#脚本:public event Action&Transform& OnTargetS
// This is triggered when a destination is set.
private void OnEnable(){
m_InteractiveItem.OnDoubleClick += HandleDoubleC}private void OnDisable(){
m_InteractiveItem.OnDoubleClick -= HandleDoubleC}private void HandleDoubleClick(){
// If target setting is active and there are subscribers to OnTargetSet, call it.
if (m_Active && OnTargetSet != null)
OnTargetSet (m_Reticle.ReticleTransform);}MazeCharacter游戏对象上的Player组件和MazeDestinationMarketGUI游戏对象上的DestinationMarker组件都会订阅该事件,并作出相应的响应。游戏角色可以使用Nav Mesh systems在迷宫中进行路径判断。Player组件使用HandleSetTarget函数来判断Nav Mesh Agent到十字准星间的方向,并更新Agent的轨迹-游戏角色路径的视觉渲染。C#脚本:private void HandleSetTarget(Transform target){
// If the game isn't over set the destination of the AI controlling the character and the trail showing its path.
if (m_IsGameOver)
m_AiCharacter.SetTarget(target.position);
m_AgentTrail.SetDestination();}DestinationMarker可以将标记移动到Reticle的Transform位置:C#脚本:private void HandleTargetSet(Transform target){
// When the target is set show the marker.
// Set the marker's position to the target position.
transform.position = target.
// Play the audio.
m_MarkerMoveAudio.Play();
// Play the animation on whichever layer it is on, with no time offset.
m_Animator.Play(m_HashMazeNavMarkerAnimState, -1, 0.0f);}在下图中可以看到reticle,目的地标记,玩家和轨迹。迷宫中的切换开关也是在VR中和物体进行交互的示例,其中用到了Collider,以及VRInteractiveItem,和SelectionSlider三个类。正如上图中显示的,和其它交互对象一起,SelectionSlider脚本会监听由VRInteractiveItem和VRInput所分发的事件。C#脚本:private void OnEnable (){
m_VRInput.OnDown += HandleD
m_VRInput.OnUp += HandleUp;
m_InteractiveItem.OnOver += HandleO
m_InteractiveItem.OnOut += HandleO}Flyer场景中的交互Flyer场景是一个计时”无尽飞行”游戏,在其中玩家可以通过四处看来引导飞船的方向,并使用Fire1输入键进行射击,通过击中陨石或是引导飞船穿越空中的门来得分,跟Pilotwings或Starfox这两款游戏有点类似。在交互方面,Flyer使用了更简单的方式,也就是让FlyerLaserController订阅VRInput的OnDown事件,从而发射激光。C#脚本:private void OnEnable(){
m_VRInput.OnDown += HandleD}private void HandleDown(){
// If the game isn't running return.
if (!m_GameController.IsGameRunning)
// Fire laser from each position.
SpawnLaser(m_LaserSpawnPosLeft);
SpawnLaser(m_LaserSpawnPosRight);}Shooter180和Shooter360场景中的交互(Target Gallery/ Target Arena)。在VR Samples包含了两个射击游戏,其中一个是回廊射击游戏,玩家在180度视角的走廊中对潜在目标射击。另外还有一个竞技场射击游戏,玩家被类似X战警场景的潜在目标包围。这两款游戏中的每个目标对象都有一个Collider,VRInteractiveItem和ShootingTarget。ShootingTarget组件订阅了VRInteractiveItem的OnDown事件,以判断目标是否被击中。该方法适用于瞬间命中(比如激光枪这种)的设定,如果要展示子弹时间,我们就需要考虑其它解决方案了。现在我们应该对基本的VR交互组件有了大概的印象,包括任何在VR Samples项目中具体使用这些组件。现在让我们来看看VR Samples项目中如何使用gaze(凝视)和reticles(十字星)。GAZE(凝视)在VR应用中判断用户正在看什么很重要,可能是用于判断用户和游戏对象的交互,或是触发一个动画,也可能是向目标发射子弹。我们将VR中“看”这个动作定义为gaze(凝视),而在后续的教程中我们将频繁使用这个词。考虑到目前大多数HMD头戴设备还不支持眼部追踪,因此我们只能估计用户的gaze(凝视)。透镜的扭曲意味着用户正看着正前方,有一个简单的解决方案。正如在概览中提到的,我们只需要从摄像机的中心发射一条射线,然后找到这条射线所碰撞的物体即可。当然,这就意味着所有要被碰撞(或是需要通过“凝视”进行交互)的对象都必须关联一个Collider组件。Reticle(十字准星)十字准星用于辅助标记用户视野的中心。十字准星的样式可能是简单的点,也可能是一个十字准线,具体形式取决于项目需求。在传统的3D游戏中,十字准星被设置为空间中的固定点,比如通常是屏幕的中央。但是在VR中使用十字准星变得非常复杂:当用户在VR环境中四处观望时,双眼将汇集在靠近摄像机的物体上。如果十字准星处在一个固定的位置,那么用户会看到两个准星:我们在现实世界里面可以轻易模仿这种效果。把某个手指放在眼睛前面,然后聚焦到近处和远处的物体上。当我们聚焦在这个手指上时,就会看到两个背景,反之亦然。这就是传说中的 现象。为了避免用户在查看周围环境和注视不同距离的物体时看到两个准星,我们需要将准星放到3D空间的同一个点,也就是用户所关注对象的表面。将准星放在空间的这个点意味着从远处看准星将非常小,当靠近时会变大。为了让准星的大小不随距离发生变化,我们需要根据它到摄像机的距离对其进行缩放。为了说明这一点,我们从Examples/Reticle场景中找了一些例子,展示了处于不同距离和比例的准星。准星放置在靠近摄像机的物体上:准星放置在稍远的物体上:准星放置在远处:根据所处的位置和自身比例,用户在任何距离上看到的准星大小都是相同的。如果没有击中任何对象,那么我们只需把准星放到一个预设的距离上。在室外环境中,可能会放在摄像机的Far clip plane前面,在室内场景中可能会近得多。将十字准星渲染到其它游戏对象的表面如果十字准星恰好和某个对象的位置相同,那么准星可能会嵌入到临近的对象中。为了解决这个问题,我们需要确保将准星渲染到场景中所有对象的前面。在VR Samples中,我们提供了一个shader,基于Unity现有的名为UIOverlay.shader的”UI/Unlit/Text” shader。在选择某个材质的shader时,可以在”UI/Overlay”中找到。这个shader对UI 元素和文本都适用,会在场景中其它物体的前面绘制。将准星和场景中的游戏对象对齐我们希望准星的旋转方向和它所命中的对象的法线相匹配。通过RaycastHit.normal就可以实现这一点,以下是具体的实现代码:C#脚本:public void SetPosition (RaycastHit hit){
m_ReticleTransform.position = hit.
m_ReticleTransform.localScale = m_OriginalScale * hit.
// If the reticle should use the normal of what has been hit...
if (m_UseNormal)
// ... set it's rotation based on it's forward vector facing along the normal.
m_ReticleTransform.rotation = Quaternion.FromToRotation (Vector3.forward, hit.normal);
// However if it isn't using the normal then it's local rotation should be as it was originally.
m_ReticleTransform.localRotation = m_OriginalR}我们可以在Maze场景中看到这个action。下图展示了准星如何匹配墙壁的法线:下图展示了准星如何匹配地板的法线:我们还提供了一个示例的Reticle脚本。该脚本可以跟VREyeRaycaster一起适用,从而将准星放置到场景的正确位置,并且可以选择跟所命中的对象法线帖齐。以上内容都可以在VRSampleScens/Scens/Examples/中看到。在VR项目中头部的旋转和位置 在头戴设备中跟踪头部的旋转和位置可以用沉浸式的体验来感受周围环境,但同时也可以让对象根据这些数值所相应的相应。为了获取这些数值我们需要用到VR.InputTracking类,并指定我们要访问的VRNode。为了获取头部的旋转,我们会希望用到VRNode.Head,而不是两只眼睛。想了解更多的信息,可以参考Getting Started with VR Development一文中的Camera Nodes。使用头部旋转作为输入方式的可能应用是精细旋转菜单或是其它对象。在VRSampleScenes/Examples/Rotation场景中可以看到这一点的示例。下面是ExampleRotation的脚本:C#脚本:// Store the Euler rotation of the gameobject.var eulerRotation = transform.rotation.eulerA// Set the rotation to be the same as the user's in the y axis.eulerRotation.x = 0;eulerRotation.z = 0;eulerRotation.y = InputTracking.GetLocalRotation(VRNode.Head).eulerAngles.y;下面的图展示了游戏对象如何根据用户所注视的位置来进行旋转:在Flyer游戏场景中,我们将看到太空飞船基于头部的旋转来调整自身位置,具体参考FlyerMovementController:C#脚本:Quaternion headRotation = InputTracking.GetLocalRotation (VRNode.Head);m_TargetMarker.position = m_Camera.position + (headRotation * Vector3.forward) * m_DistanceFromC在VR游戏中使用触摸板和键盘进行交互Gear VR在头戴设备的侧边配备了一个触摸板。Unity把这个触摸板当做鼠标来使用,所以我们可以使用以下方法:
Input.mousePosition Input.GetMouseButtonDown
Input.GetMouseButtonUp在使用Gear VR时,开发者可能会希望从触摸板中获取swipe数据。我们提供了一个名为VRInput的示例脚本,可以处理swipe,触碰和双触。此外它还支持方向键和键盘上的左Ctrl键(在Unity中的默认输入术语是Fire1),或者是鼠标上的左键,以此来处罚swipe和触摸。在Unity Editor中,我们可能会希望使用DK2来测试Gear VR的内容。因为目前暂时无法直接从Unity直接关联到Gear VR进行测试。考虑到Gear VR的触摸板作用跟鼠标类似,我们可以考虑使用鼠标来模拟输入。当用户佩戴HMD设备时操控键盘会更容易,因此VRInput同时也会讲方向键操作处理成swipe,将Left-Ctrl(Fire1)处理成触碰。在使用游戏手柄时,左侧的stick可以用作swipe,其中的某个按键可以用作触碰。关于如何处理swipe,可以参考VRSampleScenes/Scenes/Examples/Touchpad以下是ExampleTouchpad脚本,其中根据swipe的方向将AddTorque方法作用于一个刚体,从而让对象旋转。C#脚本:using UnityEusing VRStandardAssets.Unamespace VRStandardAssets.Examples{
// This script shows a simple example of how
// swipe controls can be handled.
public class ExampleTouchpad : MonoBehaviour
[SerializeField] private float m_Torque = 10f;
[SerializeField] private VRInput m_VRI
[SerializeField] private Rigidbody m_R
private void OnEnable()
m_VRInput.OnSwipe += HandleS
private void OnDisable()
m_VRInput.OnSwipe -= HandleS
//Handle the swipe events by applying AddTorque to the Ridigbody
private void HandleSwipe(VRInput.SwipeDirection swipeDirection)
switch (swipeDirection)
case VRInput.SwipeDirection.NONE:
case VRInput.SwipeDirection.UP:
m_Rigidbody.AddTorque(Vector3.right * m_Torque);
case VRInput.SwipeDirection.DOWN:
m_Rigidbody.AddTorque(-Vector3.right * m_Torque);
case VRInput.SwipeDirection.LEFT:
m_Rigidbody.AddTorque(Vector3.up * m_Torque);
case VRInput.SwipeDirection.RIGHT:
m_Rigidbody.AddTorque(-Vector3.up * m_Torque);
}}VR Samples项目中的VRInput示例正如上面所提到的,我们所有的示例游戏都使用VRInput来处理触摸屏和键盘的输入。Maze游戏中的摄像机也会对swipe作出响应:Maze在这个场景中,CameraOrbit对swipe进行监听,从而允许对视点进行调整:C#脚本:private void OnEnable (){
m_VrInput.OnSwipe += HandleS}private void HandleSwipe(VRInput.SwipeDirection swipeDirection){
// If the game isn't playing or the camera is fading, return and don't handle the swipe.
if (!m_MazeGameController.Playing)
if (m_CameraFade.IsFading)
// Otherwise start rotating the camera with either a positive or negative increment.
switch (swipeDirection)
case VRInput.SwipeDirection.LEFT:
StartCoroutine(RotateCamera(m_RotationIncrement));
case VRInput.SwipeDirection.RIGHT:
StartCoroutine(RotateCamera(-m_RotationIncrement));
}}如果想了解为什么场景中的摄像机按照某个轨道运行,而不是旋转迷宫本身,可以参考这篇文章。在看完本文后,我们应该对VR Sample场景中的基本交互有更深入的理解。虽然还有其它方式来实现VR交互,但这种方法是最简单易行的。在下一篇文章中,我们将讨论不同类型的VR用户界面。如果在学习中有任何问题,可以到中参与讨论。","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T11:13:48+08:00","url":"/p/","title":"不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列3 VR中的交互方式","summary":"概览:在VR项目中,我们需要在用户”凝视“某个物体时将其激活。在VRSamples中,我们构建了一个简单的,可拓展的轻度系统,让用户跟场景中的物体进行交互。其中包含了三个主要的脚本文件:VREyeRaycaster,VRInput和VRInteractiveItem,下面将对这三个重要的…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":3,"likesCount":32}},"annotationDetail":null,"commentsCount":13,"likesCount":28,"FULLINFO":true}},"User":{"eseedo":{"isFollowed":false,"name":"王寒","headline":"Create a world like Caprica.","avatarUrl":"/7dd67dbfe_s.jpg","isFollowing":false,"type":"people","slug":"eseedo","bio":"Apple,SF,Psychology","hash":"4c9dd7ce259e3e6ae2f0fa6ca42801ee","uid":00,"isOrg":false,"description":"Create a world like Caprica.","profileUrl":"/people/eseedo","avatar":{"id":"7dd67dbfe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false,"badge":{"identity":null,"bestAnswerer":null}}},"Comment":{},"favlists":{}},"me":{},"global":{"experimentFeatures":{"ge3":"ge3_9","ge2":"ge2_1","isOffice":"false","nwebStickySidebar":"sticky","qrcodeLogin":"qrcode","favAct":"default","default":"None","mobileQaPageProxyHeifetz":"m_qa_page_nweb","newMore":"new","newBuyBar":"livenewbuy3","newMobileColumnAppheader":"new_header","appStoreRateDialog":"close","sendZaMonitor":"true","homeUi2":"default","answerRelatedReadings":"qa_recommend_with_ads_and_article","wechatShareModal":"wechat_share_modal_show","iOSNewestVersion":"4.2.0","qaStickySidebar":"sticky_sidebar","androidProfilePanel":"panel_b","liveStore":"ls_a2_b2_c1_f2","zcmLighting":"zcm"}},"columns":{"next":{},"kidscoding":{"following":false,"canManage":false,"href":"/api/columns/kidscoding","name":"笨猫快乐学编程","creator":{"slug":"eseedo"},"url":"/kidscoding","slug":"kidscoding","avatar":{"id":"f9a1d3e049","template":"/{id}_{size}.jpeg"}}},"columnPosts":{},"columnSettings":{"colomnAuthor":[],"uploadAvatarDetails":"","contributeRequests":[],"contributeRequestsTotalCount":0,"inviteAuthor":""},"postComments":{},"postReviewComments":{"comments":[],"newComments":[],"hasMore":true},"favlistsByUser":{},"favlistRelations":{},"promotions":{},"switches":{"couldAddVideo":false},"draft":{"titleImage":"","titleImageSize":{},"isTitleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null}},"drafts":{"draftsList":[],"next":{}},"config":{"userNotBindPhoneTipString":{}},"recommendPosts":{"articleRecommendations":[],"columnRecommendations":[]},"env":{"edition":{},"isAppView":false,"appViewConfig":{"content_padding_top":128,"content_padding_bottom":56,"content_padding_left":16,"content_padding_right":16,"title_font_size":22,"body_font_size":16,"is_dark_theme":false,"can_auto_load_image":true,"app_info":"OS=iOS"},"isApp":false},"sys":{},"message":{"newCount":0},"pushNotification":{"newCount":0}}}

我要回帖

更多关于 手机游戏开发前景 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信