如何用unity开发vr安卓游戏和Cardboard做一款VR游戏

You are here:
如何用Unity和Cardboard做一款VR游戏
【Gamelook专稿,转载请注明出处】
Gamelook报道/随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左右,消费者设备安装量在3890万左右,凭借价格门槛的优势,以谷歌Cardboard和三星Gear VR为代表的移动VR设备很大可能成为用户量最大的设备,可能占据2016年虚拟现实设备安装量71%的份额,达到2700万。
最近,一位从事VR游戏研发的开发者在自己的博客中展示了如何用Unity和Cardboard把一款3D游戏变成VR游戏的方法,他在文章最后还表示,你甚至可以用这种方法把游戏转化为AR游戏,或者从头开始做新的VR游戏,以下是Gamelook编译的博文:
很多的科幻电影都展示了用人类意志控制物体的能力,但到目前为止,这仍旧是一种幻想,目前还没有技术可以实现这一点。在这份新手教学博客中,你可以学到如何用Unity做一款兼但的虚拟现实游戏,配合谷歌Cardboard创造比较简单的VR体验,本文主要讲的是:
把Cardboard摄像头集成到你的游戏中;调整UI元素以适应VR模式;做VR模式下可以选择的按钮;在游戏运行的时候程序化地把游戏在常规和VR模式下进行切换。
什么是谷歌Cardboard?
理论上说,创造VR体验是非常直接的,你在屏幕上展示的并不是一个单独的图片,而是需要2个。因为它们来自位置相隔几英寸距离的两个摄像头,玩家们从左摄像头看到的是左边图像,右边看到的则是右边图像,这就创造了游戏景深。
此外,再加上一些不错的动态传感器,你可以探测到用户面朝哪个方向。把这些和你所创造的3D世界结合起来的话,就可以获得一个沉浸感很强的游戏体验。在实际情况中,在一个高分辨率的屏幕上展示两个图像需要非常复杂的硬件,还需要可以追踪玩家的头部运动,把所有的功能集成到一个设备商,还要控制其重量,以免让用户戴起来太累。
然而,随着谷歌Cardboard的出现,每一台智能机都有可能与Cardboard协作,可以用你手机的屏幕与传感器,把它们变成VR设备的一种,而你所需要的,只是一些Cardboard和塑料镜片。
需要注意的是,你可能大量用到Unity GUI,所以如果从来没有尝试过这个工具,那么最好是看看Unity GUI教程。想要用Google Cardboard做出自己的VR游戏,你需要以下工具:
Unity专业版,版本5以上;一部智能机,可以是iPhone 5代以后的iOS设备,也可以是4.3以上版本的Android设备。需要说的是,本文假设你是在用iPhone获得VR游戏体验。
如果你从来没有用过Unity而且也不熟悉界面,那最好是去读Unity教程介绍
可能会有人说,我如何获得一个Cardboard硬件呢?
当然,如果还没有Cardboard设备的话,最好是从供应商那里选购,价格加运费大约是20-30美元,如果你觉得自己非常善于DIY,也可以动手做自己的版本。在购买Cardboard的时候,要注意提到V2或者Cardboard 2.0的字样,因为它们适配大量的手机,包括大屏幕的iPhone 6+在内,它们还支持用户通过按钮进行输入操作。
没有Cardboard设备可以吗?
从某种程度上说,是可以的,你仍然可以在自己的设备上运行做出来的游戏,它看起来会是这样的(下图):
在玩游戏的时候,如果你用恰当的方式盯着屏幕看,也可以找到VR的感觉。如果你四处移动手机,就可以进行控制。虽然你也可以玩这款游戏,还能够看到游戏的实际效果,但这种体验是比较有限的。
长话短说,如果你没有足够的耐心等待Cardboard到货,你仍然可以从本文中学到东西,只是,如果有合适的设备,你能够学的东西更多。
样本游戏:Ninja Attack is Back!
投入一些时间尝试这个样本游戏,下载并解压这个Unity新手项目。接下来就是运行Unity,在欢迎界面,选择打开(Open)-找到StarterNinja文件夹,打开NinjaAttack项目。
在项目浏览器(Project Browser)中,在Assets里双击MainScene按钮,然后点击Play尝试一下这款游戏。在图片中,你是左边的忍者,随着怪兽在屏幕中出现,你可以在屏幕上点击任何地方释放一个忍者之星消灭怪兽,在击杀20个怪兽之后,你就赢了,但是,如果怪兽到达了左边的红色区域,你就输了。
这款游戏看起来很熟悉是吗?熟悉的读者可能会发现,它其实就是我之前介绍SpriteKit以及Cocos2D教程用到的游戏,不过与之不同的是,这里的游戏是用3D渲染的。当然,你并不一定能够真正地看到非常酷炫的3D效果,这款游戏使用的是上帝视角,所以对所有的polygon进行渲染总觉得浪费时间,所以,你现在可以发现为什么这款游戏非常适合做成VR了。
开始使用Cardboard
你需要做的第一件事就是为Unity下载Cardboard SDK。接下来,把它导入到你的项目中。从Unity的主菜单,选择Assets\Import Package\Custom Package,然后选择你刚刚下载的CardboardSDKForUnity.unitypackage。确保所有东西都被选中,反选Legacy文件夹,然后点击Import按钮。
为了让你的游戏作为一个VR体验,你需要用到一些技巧,在Project Browser中的Cardboard\Prefabs文件夹里,把CardboardMain Prefab拖拽到你的场景中,在Inspector中,给其赋予和你的忍者角色一样的位置(5.53,1.13,0.122),并且要进行90度Y Rotation。
你会发现的是,它比忍者的中心部位略高,这样可以展现出你在看他的眼睛。
接下来,选择主摄像头(Main Camera)并且在Inspector中反选,做raccoon忍者对象的时候也需要同样的操作。现在,把游戏在Unity编辑器中再次运行,你就会看到一些类似于3D场景的东西。如果你在移动鼠标的时候按住选择键,你的摄像头就会随着头部的运动进行旋转。
在iOS设备上运行你的游戏场景
在Unity编辑器中运行你的游戏是非常不错的,但最后一次检查的时候,用VR头盔配上电脑显示器看起来会让人很痛苦,所以我们需要适配到iPhone上。
选择File\Build Settings,iOS应该已经被选为你的默认平台,点击Click Player Settings然后转换到Inspector。
在Resolution and Presentation菜单下,把Default Orientation设置成Landscape Left。
在其他设置(Other Settings)中,把Bundle Identifier改成你的公司所需要的东西,比如com.(你的公司名).NinjaAttackVR。
把目标设备改为iPhone,把iPhone和电脑进行连接,选择Build和Run,然后给输出文件夹命名,这个名字你可以随意取。
这时候,Unity就会导出你的项目,然后它就会自动在Xcode中打开,如果没有打开,启动Xcode并且手动打开生成后的项目,运行然后在手机上尝试。首次运行游戏的时候,你需要一系列的设置过程,比如可以在Cardboard硬件上扫描二维码,这样Cardboard SDK就可以根据你的设备、距离等进行画质微调。
需要注意的是,如果设置过程中,你在扫描二维码的时候出现了 网址打开错误,那就必须调整Xcode项目中的info.plist,苹果开发者论坛中有说到这个问题,感兴趣的童鞋可以亲自查阅。
接着,把你的手机插入Cardboard当中,来回转头以调整摄像头视角,你就可以看到相对不错的3D画面了。
再一次把它做成游戏
能够看到你的游戏世界是非常不错的,但初次之外,你还需要把玩法加入到游戏中,特别是你需要从忍者面朝的方向扔出忍者之星,这是你将要做的第一个玩法。
对于UI来说,Cardboard支持一个按钮,看起来可能是比较有限,但如果把它和头部的动态追踪相结合的话,它可以做出更为复杂的互动。在《Ninja Attack》中,你通过Cardboard.SDK.VRModeEnable资源侦测玩家是否开始了VR模式,检查按钮是否和Cardboard.SDK.Triggered资源同时按下去了,如果这些值都对,就可以在用户面朝的方向扔出忍者之星。
打开你的NinjaStarLauncher.cs脚本,你会发现它在Inspector里是和GameLogic GameObject连在一起的。
创造一个新的private变量:
private Vector3 _vrShooterO
把它在Start() method中初始化:
_vrShooterOffset = new Vector3(0.0f, -0.4f, 1.0f);
用以下代码替换Update ():
这就可以运行了,接下来我们看看Update()是做什么的:
你首先检查游戏是否在VR模式,用户是否按下了按钮检查Cardboard.SDK singleton object上的资源。
在此之后,你可以调用LaunchNinjaStarFrom()释放一个忍者之星,你需要用到两个parameter:
第一个是GameObject头文件,Cardboard库会为你调出来,所以它应该是已经指向了正确的位置;第二个是轻微偏移,这样你面前的忍者之星就会看起来更真实,否则的话你扔出去的忍者之星就像是在四只眼之间进行运动,虽然看起来很cool,但给人的感觉很奇怪。
由于你的Ninja Star GameObject已经被设计飞往特定方向,所以它会朝着正确的方向进攻。
再试一次,这时候,你可以转头扔向坏人,输赢logic仍旧起作用。
解决Game Over菜单
你可能已经注意到了,当游戏结束的时候,用之前的Game Over按钮,你的角色仍旧是在屏幕的左边。这款游戏用到了Display Canvas来展示Game Over界面,Unity最新的GUI教程中有讲到这一点,它总是出现在游戏窗口的顶部。这个标签适用于大多数的游戏GUI,因为它可以自动适应到你屏幕的上方,不论你的摄像头在做什么,而且它可以非常不错地适应不同屏幕尺寸。
但在这个案例中,你需要一个存在于游戏世界中的GUI canvas,有一部分原因是它可以在3D环境中更好渲染,但还因为不希望把玩家爱是叫锁定到摄像头上。你的玩家们需要可以上下自由地看,这样他们可以看到不同的UI元素,找到最活跃的然后点击按钮。
创造一个新的Canvas
在Hierarchy菜单下选择GameOverCanvas,右击并且选择复制,重命名为VRGameOverCanvas,这样可以使它与原来的进行区别开来,把GameOverTxt重命名为VRGameOvertxt。
在VRGameOverCanvas组件中,把渲染模式改为World Space。
在Rect Transform组件中,把位置改为(-2.24,1.1,0.07),然后进行90度Y Rotation
最后,把X和Y Scale改为0.009,当所有一切完成的时候,VRGameOverCanvas看起来因该是这样的:
你可以在Game View视角下看到两个canvas是大致重叠的(当游戏不运行的时候):
这些值是哪里来的呢?坦白地说,我其实是调整到自己通过Cardboard摄像头看起来比较不错为止。有时候,编程更多的是一门艺术而不是学科。
支持两个Canvase
接下来,你需要更改GameController.cs,这样它才会发现两个Canvas打开和GameLogic GameObject脚本,它也是和GameLogic GameObject联系在一起的。把以下的两个公共变量加入到你的class里:
public Canvas VRGameOverC
public Text VRGameOverT
在resetGame()的开始加入如下代码:
VRGameOverCanvas.enabled =
用以下代码取代Gameover():
public void GameOver(bool didIWin) {
isGameOver =
_didIWin = didIW
string finalTxt = (_didIWin) ? “You won!” : “Too bad”;
if (Cardboard.SDK.VRModeEnabled) {
VRGameOverCanvas.enabled =
VRGameOverTxt.text = finalT
gameOverCanvas.enabled =
gameOverTxt.text = finalT
这个展示了正确的Canvas和Text对象,取决于你是否在VR模式(开启Cardboard.SDK.VRMode).
在你保存了脚本之后,你需要把正确的对象分配到新的公用变量。在Inspector里找到GameController,点击每个新变量旁边的目标,然后选择VRGameOverCanvas对象作为你的VR游戏Over Over Canvas变量,把VRGameOverTxt对象选为你的VR Game Over Txt变量。
需要注意的是,可能你会奇怪,为什么是很麻烦地支持两个Canvas而不是至改变现有的一个呢?原因是,你既需要支持上帝视角,还需要支持VR模式,所以一定要进行优化。
如果你准备现在就运行游戏,就可以发现VR模式里的游戏结束界面展示的很自然。你可以上下看界面的不同部分,现在所有缺少的东西就是再来一次的按钮。
增加Gaze输入方式
幸运的是,Unity内置了‘在使用world-space GUI Canvas的时候,摄像头中心点可以作为鼠标使用’,但你需要提供额外的脚本才能使它在VR界面中进行使用。
首先,扩展Cardboard Main\Head,找到主摄像头并把它重命名为VR Main Camera。选中VRGameOverCanvas对象,你们应该可以看到一个事件摄像头,点击Hierarchy里的EventSystem项目,点击增加组件按钮,并增加GazeInpute Module脚本。这个脚本可以确保Unity的GUI系统了解Cardboard摄像头的工作方式。
检查VR Mode Only,因为在VR模式下的时候,只需要这么运行就可以了。最后,点击你刚刚增加的Gaze Input Module Component,然后选择Move Up,重复一次,确保它可以出现在触屏输入和独立输入模式中,这可以确保Gaze Input Module在游戏进行的同时优先选择输入方式。当所有都做好的时候,它看起来应该是这样的:
现在,你就可以进行尝试了。这一次,当你把视角放到Play Again按钮的时候,它就会变绿,让你重新开始一场新的游戏。
或许你会发现这个版本的游戏在VR模式下玩起来有点难,这是因为你的视角是缩水的,所以在你看着错误的方向时,敌人很容易从你身边溜过去。而且,你无法迅速改变瞄准方向,你会因为脖子转速的限制而影响到游戏操作。你让玩家体验VR模式并不是为了惩罚他们,所以,你该如何调整呢?当然,可能会有人建议把敌人速度降低。
在Prefabs文件夹中选中EvilSlimeEnemy Prefab,然后打开EnemyMover.cs,把以下代码增加到Start(),随后设置速度:
这会让你的游戏在VR模式下变得更简单,所以玩家们不至于因为选择了VR模式就获得糟糕体验。
解决屏幕上的分数显示问题
你还需要解决的一个UI问题是屏幕上的分数,这个就需要不同的方式来处理了。虽然它仍然需要在VR模式中恰当的被显示出来,但你更希望它在你看任何方向的时候都固定在摄像头上。
选中Cardboard Main\Head,右击并选择UI\Canvas,重命名新的canvas为VRScoreCanvas,把渲染模式调整为World Space,为其赋予以下值:
位置(0,1,2.5)、宽度400、高度100、旋转(0,0,0)、Scale(0.5,1)。当完成之后,游戏看起来该是这样的:
看起来可能你的文本很奇怪地放在了屏幕中央,但在VR模式里,你能够看到的世界比正常情况下是少很多的,所以你在游戏中看到分数的时候应该是在边缘部位的,你可以自由进行位置调整,以使其适应你的手机。
接下来,使用文本对象展示你的分数,这个过程和Game Over的做法类似。
打开GameController.cs并增加一个新的公用变量:
public Text VRScoreT
接下来,你每次更新scoreTxt的时候都需要更新VRScoreTxt,在ResetGame() method中,把以下代码加在每次更新后的scoreTxt之后:
VRScoreTxt.text = “–“;
然后把这行代码增加到GotOne(),也放在更新scoreTxt的后面:
VRScoreTxt.text = “” + _currS
保存你的脚本,回到Unity,然后你会发现GameLogic当中的GameController Component如今可以输入VR Score Txt变量了,点击临近的目标然后选择你的VRScoreTxt文本对象。
再次体验你的游戏,现在,你就可以看到分数出现在左上角了,还可以允许你的头部进行运动。
VR模式的切换
由于你的游戏同时支持上帝视角和VR模式,你应该给用户自由切换的选择,UI做起来是很直观的,你只需要在上帝视角模式中加入一个简单的按钮,让玩家们来回切换模式即可。
首先,你需要增加切换的代码,选择Hierarchy里的GameLogic,点击增加组件,选择新脚本(New Script)然后把脚本命名为CardboardSwapper。
打开并用以下内容替换class代码:
这个class里最重要的method就是ActiveVRMode,它是用来激活Cardboard的VR模式的。其余的logic负责控制场景中的多个GameObject,取决于是否处于VR模式,你在上帝视角是看不到某些东西的。
你还可以发现的是,当你侦测后面按钮的时候调用了Switch(),这个功能非常适合测试。
你还需要为GameController脚本增加更多的logic,这样它才能在切换模式的时候展示或者隐藏一些东西,打开GameController.cs,把这个method加进去:
public void RefreshGameOver() {
gameOverCanvas.enabled =
VRGameOverCanvas.enabled =
if (isGameOver) {
GameOver(_didIWin);
保存一切然后重新回到Unity界面,选择GameLogic然后向下滚动到Cardboard Swapper组件,对于Cardboard Object数列,把它的大小赋值为1,然后放到场景中的CardboardMain GameObject中。这样不仅可以禁用你的Cardboard Head让你回到上帝视角摄像头模式,还可以禁用VRScoreCanvas。
对于Mono Object数列,把它的大小赋值为3,然后为你的场景选择Canvas、Main Camera和raccoon ninja,不要从Assets里选择。
最后你需要在上帝视角canvas为用户增加一个按钮,为了节约时间,我已经把它做好了,位于prefabs文件夹中。
从Assets\Prefabs中把CardboardButton推拽到Hierarchy,这样它就成为了你的Canvas对象的子对象,确保其位置设定是(-50,50,0):
在你的按钮对象底部,把它们连接起来,这样点击按钮的时候就可以调用CardboardSwapper.Switch() method,你可以从这个动画看看是如何做出来的:
再次尝试你的游戏,点击屏幕右下方的按钮切换至VR模式,然后单机Cardboard界面背后的按钮切换到上帝视角模式。做到这里,你的VR模式切换就已经完成了。
现在,你可以把Unity中的任何3D游戏做成VR游戏了,而且只需要一个Cardboard和一些塑料镜片,这是可以让所有人都能够体验的VR游戏。Android版本的做法和iOS大致相同,谷歌的Unity Developer指南还提供了更多的技术信息。最后,你甚至可以为你的VR游戏增加AR功能。
最后,你可以尝试Unity里所有的3D游戏,看是否能够顺利地做成VR体验,或者,这个教程也可以让你做出全新的VR游戏。
& 2016 . All rights reserved.扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 6554|回复: 124
用unity和Google Cardboard制作VR游戏
7排名<font color="#FF昨日变化5主题帖子积分
蛮牛币4333
在线时间535 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 caedmom 于
10:10 编辑
注:这篇教程是 Feast的一部分。想看Unity Feast中的更多教程或者学习如何加入Unity Feast团队,点击这里。
01.png (62.15 KB, 下载次数: 3)
09:55 上传
Transform a boring ol’top-down game (top) to an exciting VR game (bottom)!
保险地说,可能因为现代电影的经典,大家就已经开始等待虚拟现实的体验了,“割草者”给我们展示了潜在的科技。它许诺了虚拟现实的未来,呃~~~,大家都会有心灵感应能力。或者类似的吧。
在这篇教程中,通过学习简单的游戏并使用Google Cardboard作为虚拟现实体验,你将帮助人类为他们心灵感应的未来和虚拟现实做准备。将会发现改如何做:
在项目中集成一个Cardboard相机
修改UI元素以至于它们可以在VR模式下工作
在VR模式下使按钮可选择
运行时在普通和VR模式下转换
注:在写的时候,注意通过VR设备达到精神控制和成为超人类并不是一个可行的技术,虽然“割草人”向我们展示了。所以,直到Apple有了一个精神控制的API,也只能坚持控制它的前体。
什么是Google Cardboard
理论上,创建VR体验很简单。取代在屏幕上将世界作为一张图来展示,这个同时展示两张。
它们来自放置相隔几英寸的两个摄像机,用户用左眼通过左边的摄像机观看图片,反之亦然,生成表象深度。
此外,加上运动传感器的明智使用,可以检测用户面对的方向。结合创建的3D世界,就会让自己有一个身临其境的体验。
02.png (96.66 KB, 下载次数: 3)
09:55 上传
在实践中,在高清屏幕上需要相当复杂的硬件来显示两张图,还要跟踪用户的头部,并切所有东西都要放在一个足够轻巧的设备中以便不会伤害到脖子。
很好,实际上这种高度先进的技术可能就在你的口袋里,或者放在了触手可及的地方。它几乎存在于每一部智能手机中,这也是Cardboard背后的理念;它可以显示并在手机中传感,可以只用一些指板和塑料透镜将它转变为一个很棒的VR设备。
注:你将会多次使用unityGUI。如果以前从没有用过,也许应该先看看Unity GUI tutorial。
为了开始做自己的Google Cardboard VR游戏,需要以下方面:
Unity个人版,版本5.x。
一部智能手机,iPhone5以上版本或运行Jelly Bean的安卓手机来做测试。还有,这个教程采用的是iPhone。
还有一个Cardbroadunit。
注:如果是初学者对界面不熟悉的话,可以看看这个网站中的Introduction to Unity来快速上手。
等一下….如何获取Cardboard Unit?
没有Cardboard unit?最好的办法是从这里列举的供应商中选择。会花费$20到$30,包括运费。如果感觉像一个DIY达人,可以自己做一个。
买Cardboard设备时,找标有“V2” 或 “Cardboard 2.0”的,因为这些适合更多种类的手机,包括像iPhone 6+这样的大手机。它们还支持用户通过覆盖导电金属条的按钮输入,当点击按钮时可以碰触到手机屏幕。
可以不用Cardboard Unit来完成这个教程吗?
好了,可以在手机上运行自己的游戏了,它看起来是这样的。
03.png (115.97 KB, 下载次数: 3)
09:55 上传
播放时如果盯着屏幕会有近似3D的体验。如果移动手机,可以像把手机捆在头部一样去控制它,还可以通过轻触屏幕模拟点击。
虽然可以播放游戏了,并且通过VRheadset观看是想要的场景,但这并不意味着可以。这就像吃巧克力和如果丧失全身行动能力时看朋友吃咸焦糖巧克力之间的不同。
长话短说:如果实在等不及Cardboard unit的到来,仍然可以学习这篇教程,不过用合适的设备会学到更多的东西。
简单的游戏——Ninja Attack is Back!
花费一些时间来尝试一个简单的游戏,下载并解压Unity starter project(下方回复可见)。
下一步,启动unity,在开始界面,选择Open并选择StarterNinja 文件夹来打开NinjaAttack项目。
在项目浏览器中,双击Assets中的MainScene 。然后点击Play试一下。
你是左边的忍着。怪物会在屏幕走动,点击屏幕的任何位置来发射忍者星并将怪兽打倒!打倒20个怪兽就可以获胜,不过如果怪兽到达了屏幕左侧的红色区域,就输了。
04.png (331.05 KB, 下载次数: 3)
09:55 上传
The blobs are at it again. Will they ever learn?
这个游戏看起来熟悉吗?如果是的长期读者,会认出这个游戏和 SpriteKit and 教程中的是相同的。不过这次在很棒的3D中渲染!
05.png (65.18 KB, 下载次数: 3)
09:55 上传
或许你会注意大多数很棒的面数。整个游戏界面是top-down的啊。这感觉渲染所有的多边形是一种浪费。现在也许明白了为什么这个游戏是做VR的最佳选择。
开始使用Cardboard首先要做的是下载Cardboard SDK for Unity。接下来,将它导入到项目中。从unity的菜单中选择Assets\Import Package\Custom Package…然后选择刚刚下载的CardboardSDKForUnity.unitypackage 。确认每一项都选中了,不要选Legacy 这项,然后点击Import 按钮。
06.png (172.78 KB, 下载次数: 3)
09:55 上传
为了让游戏在VR上体验,需要执行一些快速的dirty hacks。在项目浏览器的Cardboard\Prefabs 文件夹,把CardboardMain 拖入场景中。在检视面板,给它和忍者角色相同的位置——-(5.53, 1.13, 0.122) ,并且Y轴旋转90度。
07.png (48.67 KB, 下载次数: 2)
09:56 上传
通过它的眼睛看到的实时会发现比忍者的中心位置高一些。然后,在层级面板选择Main Camera,并在检视面板中禁用它。对raccoon-ninja 对象做相同的事情。现在,再次在unity中运行游戏,就会看到一个类似于3D的场景!如果按下选项键并移动鼠标,摄像机就会像扭转头一样运动。
08.png (82.75 KB, 下载次数: 3)
09:56 上传
在IOS设备上运行场景
09.png (55.11 KB, 下载次数: 3)
09:56 上传
可以在unity中运行游戏真的是太棒了,不过最后检查的时候,发现在VRheadset中没有适合电脑显示器的方法,这就是为什么要再iPhone上运行了。选择File\Build Settings——IOS应该已经被作为默认平台选择了。点击Player Settings并切换到检视面板。在Resolution and Presentation中,将Default Orientation 改为Landscape Left。在Other Settings中,将Bundle Identifier 改为适合你自己的机构。(像是 com.&your_company&.NinjaAttackVR)将Target Device改为iPhone Only。
10.png (41.89 KB, 下载次数: 3)
09:56 上传
将iPhone连接到电脑,选择Build and Run 并给导出文件夹一个名字;它可以是任何你喜欢的名字。Unity会导出项目,之后应该自动地在Xcode中打开。如果没有,启动Xcode并手动打开生成的项目。运行它,并在手机上尝试一下!
第一次运行游戏时,会在你的Cardboard unit上扫二维码的位置有一个安装过程。它会让Cardboard SDK基于镜头间距离,距离手机的距离等等做出细微的图形调整。
11.png (55.16 KB, 下载次数: 3)
09:56 上传
注:当扫完Cardboard unit的QR码后启动过程中出现Problem in parsing the URL 这样的错误,就不得不修改Xcode项目中的info.plist 了,在Apple developer forums里有。
现在继续把手机放入Cardboard unit里吧。转动头部来适应摄像机的视角,享受这令人信服的3D图形吧。
把它做成一个游戏!可以看到游戏世界感觉很棒,不过还是需要回到游戏设置。尤其是想要可以向面对的方向射击忍者星时。这是首先要解决的玩儿的一部分。对于UI Cardboard支持单一按钮,这点看起来有些限制,不过如果把它和头部移动的运动跟踪结合起来,它将允许更为复杂的交互。
在Ninja Attack中,会检测用户在Cardboard.SDK.VRModeEnabled 属性下的VR模式中。会检查按钮是否在Cardboard.SDK.Triggered 属性下被点击。如果这两项都为真,在用户的视角方向发射一个忍者星。打开NinjaStarLauncher.cs 脚本,会发现它依附于监视面板中的GameLogic 对象。
创建一个新的私有变量:
[C#] 纯文本查看 复制代码private Vector3 _vrShooterO
在Start() 方法中将其初始化:
[C#] 纯文本查看 复制代码_vrShooterOffset=new Vector3(0.0f, -0.4f, 1.0f);
用下边的代码替换Update() 。
[C#] 纯文本查看 复制代码void Update(){
if(Cardboard.SDK.VRModeEnabled&&Cardboard.SDK.Triggered&&
!_gameController.isGameOver){
GameObjectvrLauncher=
Cardboard.SDK.GetComponentInChildren&CardboardHead&().gameO
LaunchNinjaStarFrom(vrLauncher, _vrShooterOffset);
}elseif(!Cardboard.SDK.VRModeEnabled&&Input.GetButtonDown(&Fire1&)&&
!_gameController.isGameOver){
// This is the same code as before
Vector3 mouseLoc=Input.mouseP
Vector3 worldMouseLoc=Camera.main.ScreenToWorldPoint(mouseLoc);
worldMouseLoc.y=ninja.transform.position.y;
ninja.transform.LookAt(worldMouseLoc);
LaunchNinjaStarFrom(ninja, _shooterOffset);
这会让它运转起来,看一下Update() 都做了什么:<font color="#.首先检查游戏是否在VR模式下,并且是否通过检查Cardboard.SDK 单例模式对象点击了按钮。<font color="#.之后呼叫LaunchNinjaStarFrom() 来生成一个忍者星。传入两个参数:A.第一个是head 游戏对象。Cardboard库使它围绕你旋转,所以它应该已经被指向了正确的方向。B.第二个是轻微的偏移量,所以方法生成的忍者星会稍微靠前一些并在head游戏对象下边,这样看起来更自然一些——否则看起来像是从眼睛里发射出来的忍者星一样。这样很酷不过挺怪异的。
由于Ninja Star游戏对象已经被设计为从它创建的位置飞出去,它将会射向正确的方向。
再试一试!这次可以扭动头部并射击坏蛋。输赢的逻辑仍然适用。
12.png (141.25 KB, 下载次数: 2)
09:56 上传
修改游戏结束菜单正如所观察到的,当游戏结束时仍然停留在了原来的游戏结束菜单。它不仅错误的出现在3D中,而且还没有办法点击它。
13.png (133.56 KB, 下载次数: 3)
09:56 上传
Shockingly, thisbutton renders poorly in 3D.
游戏使用了DisplayCanvas ——正如Unity New Gui Tutorial 所见——来显示Game Over界面,其通常在游戏窗口的上方显示。画布对于大多数游戏GUI来说太棒了,因为无论游戏摄像机在做什么它都会自动伸缩来适应屏幕,而且它可以完美的控制不同的屏幕尺寸。
不过在这种情况下,需要一个可以自己存在于世界的GUI canvas,这样就可以在3D中部分正确渲染了,不过也因为不想让它被锁定在摄像机上。你想让用户可以上下观看以便他们可以看到不同的UI元素并通过点击按钮触发可用的按钮。
创建一个新的Canvas在层级面板中选择GameOverCanvas ,右键点击并选择Duplicate。将复制出的画布重命名为VRGameOverCanvas以便与原来的区别开来,并将其GameOverTxt 子对象重命名为VRGameOverTxt。
14.png (9.58 KB, 下载次数: 3)
09:56 上传
在VRGameOverCanvas的Canvas 组件中,将RenderMode 改为World Space。在Rect Transform 组件中,将Position 改为 (-2.24, 1.1, 0.07),并且YRotation 为90。最后,将X 和 Y Scale 改为0.009。所有都做好之后,VRGameOverCanvas应该是这样的:
15.png (41.26 KB, 下载次数: 3)
09:56 上传
在Game View 会看到两个画布相互重叠到了一起(当游戏没有运行的时候):
16.png (98.38 KB, 下载次数: 3)
09:56 上传
这些值是从哪里来的?说实话,我以前只是乱弄,直到通过Cardboard摄像机观察他们看起来还不错。有些时候程序设计更多是艺术而不是科学。
支持两个画布
接下来,要去改变GameController.cs 以便可以识别到两个画布。打开同样依附于GameLogic 游戏对象的GameController脚本。
在类中添加下边两个公有变量:
[C#] 纯文本查看 复制代码public Canvas VRGameOverC
public Text VRGameOverT
在resetGame()开始的位置添加下面这行:
[C#] 纯文本查看 复制代码VRGameOverCanvas.enabled=
替换GameOver() :
[C#] 纯文本查看 复制代码VRGameOverCanvas.enabled=
[C#] 纯文本查看 复制代码publicvoidGameOver(booldidIWin){
isGameOver=
_didIWin=didIW
stringfinalTxt=(_didIWin)?&You won!&:&Too bad&;
if(Cardboard.SDK.VRModeEnabled){
VRGameOverCanvas.enabled=
VRGameOverTxt.text=finalT
gameOverCanvas.enabled=
gameOverTxt.text=finalT
这个设备将可以正确的显示画布和文本对象,并且取决于是否在VR模式下(Cardboard.SDK.VRModeEnabled)。保存脚本之后,需要为新的公有变量分配正确的对象。
在监视面板中找到GameController 脚本。点击每个新变量旁边的目标,选择VRGameOverCanvas 对象作为VR Game Over Canvas变量,VRGameOverTxt对象作为VR Game Over Txt 对象。
17.png (28.38 KB, 下载次数: 3)
09:56 上传
注:你会对为什么要经历支持两个画布的麻烦而不是仅仅改变现有的一个这个困惑吗?因为最终要同时支持top-down和VR两种模式。继续看!
如果现在要运行游戏,应该会在VR模式下看到游戏结束屏。可以上下打量一下来看看界面的不同部分;丢失的是点击PlayAgain 按钮的方法。
18.png (103.88 KB, 下载次数: 3)
09:56 上传
添加注视输入幸好,当使用世界GUI画布时unity对“把相机中心点作为鼠标光标”有内置的支持,不过为了让它在VR空间里也能工作则需要提供一个额外的脚本。首先,在层级面板扩展Cardboard Main\Head 。找到Main Camera 并重命名为VR Main Camera。
19.png (7.12 KB, 下载次数: 3)
09:56 上传
选择VRGameOverCanvas 对象。会在Canvas 组件下看到一个Event Camera 入口。点击目标并选择刚刚重命名的VR Main Camera 。
20.gif (131.16 KB, 下载次数: 3)
09:56 上传
在层级面板点击EventSystem 对象。在检视面板点击Add Component 并添加GazeInputModule 脚本。这是一个确保unity的GUI系统理解Cardboard摄像机工作方式的脚本。
点击VR Mode Only 选框,因为当你在VR模式下而不是游戏的top-down版本时只想这样来工作。可以不选Show Cursor。
最后,点击刚刚添加的Gaze Input Module 组件中的gear 并选择Move Up。多做几次就会在Touch Input and Standalone Input 模块上方出现。这个需要确认注视输入模块要比其他任何游戏可以运行的输入方式的优先级高。所有都做完后,看起来应该是这样的:
21.png (112.56 KB, 下载次数: 3)
09:56 上传
现在试一下!这次,当视角集中到Play Again按钮时,它就会变绿,按下Cardboard上的按钮就会允许你“点击”它并开始新的游戏!
22.png (99.75 KB, 下载次数: 3)
09:56 上传
游戏设置细微调整也许会觉得这个版本在VR模式下玩儿有点儿难。这在一定程度上是因为视野区域较小,而且当看错误的方向时敌人很容易的掠过。还有,不能像原来一样快速的改变瞄准方向。你被脖子的扭转速度从身体上限制了。
23.png (81.57 KB, 下载次数: 5)
09:56 上传
你不想让玩家因为选择了VR模式下游戏而感觉不好!所以怎样来修正这个?
24.png (80.99 KB, 下载次数: 3)
09:56 上传
好了,我建议让敌人的速度慢下来。
在Prefabs 文件夹里选择EvilSlimeEnemy 预制件并打开附加的EnemyMover.cs。设置了thisSpeed后在Start()中添加这个代码:
[C#] 纯文本查看 复制代码if(Cardboard.SDK.VRModeEnabled){
thisSpeed*= 0.85f;
这会使敌人聚集一些。如果想让它们保持一些距离,去EnemySpawner.cs——依附于GameLogic 对象——并且设置完launchInterval后在SetNextLaunch() 里添加这几行:
[C#] 纯文本查看 复制代码if(Cardboard.SDK.VRModeEnabled){
launchInterval*= 1.1f;
这会使游戏在VR模式下容易一些——仅仅使你的玩家不会因为选择这种模式而感觉不好了。
修改屏幕上的分数另外一个需要处理的UI元素是屏幕上的分数对象,还要对这个用稍微有些不同的方法。由于它需要在VR模式下正确显示,就想要无论看向哪里它都会对摄像机作出修正。想象一下分数可以在一个保持移动的镜片上显示而且总是和玩家看的保持2米距离。这就是要创建的效果。
通过用另外一个在3D中正确渲染的画布完成了这点,不过还要将它作为Cardboard Head 对象的子集。在层级面板中选择Cardboard Main\Head 。右击并选择UI\Canvas 。将新画布重命名为VRScoreCanvas 。将它的RenderMode 改为World Space 。给它下边的值: Position: (0, 1, 2.5)Width: 400, Height: 100Rotation: (0,0,0)Scale: (0.5, 1)位置 (0, 1, 2.5)宽: 400, 高: 100高: (0,0,0)缩放: (0.5, 1) When you’re all done, it should look like this:
当所有都做完后,看起来应该是这样的:
25.png (77.38 KB, 下载次数: 3)
09:56 上传
在VRScoreCanvas右击并选择UI\Text 来添加一个文本子对象。将它重命名为VRScoreTxt。将anchor point 改为top-left。给它一个位置坐标(150, -65, 0) 和一个60的Width。
在下一个组件中,将Font Size改为18并将Alignment 改为right-aligned。最后,将Text 改为999.
当所有都做完后,看起来应该是这样的:
26.png (80.49 KB, 下载次数: 3)
09:56 上传
也许文本看起来被奇怪的对齐在了屏幕中间,不过在VR模式下会看到比正常小很多的世界,所以这个放在靠近视角的边缘位置看起来很不错。随意调整以便在手机上看起来是在右边的位置。
接下来,用这个文本添加渠道来显示分数。这个和显示Game Over画布的方式是一样的。打开GameController.cs 并添加一个新的公有变量:
[C#] 纯文本查看 复制代码public Text VRScoreT
然后每次更新scoreTxt时要更新VRScoreTxt 。在ResetGame() 方法中,更新完scoreTxt后添加这一行:
[C#] 纯文本查看 复制代码VRScoreTxt.text=&--&;
当更新完scoreTxt后将下边这行加入到GotOne()中。
[C#] 纯文本查看 复制代码VRScoreTxt.text=&&+ _currS
保存脚本,回到unity中会注意到GameLogic 的GameController 组件现在有了一个空的VR Score Txt 变量。点击旁边的目标并选择VRScoreTxt 文本对象。
27.gif (210.53 KB, 下载次数: 3)
09:56 上传
再次播放一下游戏,现在就回看到分数显示在了视角的左上方角落处,还可以允许头部移动。
28.png (107.62 KB, 下载次数: 3)
09:56 上传
来回转换VR模式既然游戏可以在top-down和VR两种模式下玩儿,就应该给玩家在两者之间切换的功能。这个的UI很简单。在top-down游戏中添加一个简单的按钮以便用户可以点击来切换为VR模式。相反,Cardboard SDK自动的显示一个可以回到top-down模式的返回按钮。试一下!
首先,需要添加控制cardboard模式转换的代码。在层级面板中选择GameLogic 。在检视面板中选择Add Component ,选择New Script 并将新脚本命名为CardboardSwapper。打开它,将用下边代码进行替换:
[C#] 纯文本查看 复制代码publicclassCardboardSwapper:MonoBehaviour{
publicGameObject[]cardboardO
publicGameObject[]monoO
// Turn on or off VR mode
voidActivateVRMode(boolgoToVR){
foreach(GameObjectcardboardThingincardboardObjects){
cardboardThing.SetActive(goToVR);
foreach(GameObjectmonoThinginmonoObjects){
monoThing.SetActive(!goToVR);
Cardboard.SDK.VRModeEnabled=goToVR;
// Tell the game over screen to redisplay itself if necessary
gameObject.GetComponent&GameController&().RefreshGameOver();
publicvoidSwitch(){
ActivateVRMode(!Cardboard.SDK.VRModeEnabled);
void Update (){
if(Cardboard.SDK.BackButtonPressed){
void Start(){
ActivateVRMode(false);
这个脚本中最重要的方法是触发Cardboard.SDK.VRModeEnabled值的ActivateVRMode 。这个是用来激活Cardboard的VR模式的。剩下的逻辑是用来启用或禁用场景中各种游戏对象的,这个取决于是否在VR模式下。
top-down模式下在Start() 开始游戏时呼叫ActivateVRMode(false) 。会注意到在Cardboard显示中当检测到返回按钮已经被按下时呼叫了Switch() 。可以通过在unity中按下esc 键来模拟Cardboard.SDK.BackButtonPressed,毫无疑问这是一个非常方便的特性。还需要在GameController 脚本中加入一些逻辑以便如果在游戏结束时转换了模式时显示或隐藏正确的画布。打开GameController.cs并添加下面的方法:
[C#] 纯文本查看 复制代码publicvoidRefreshGameOver(){
gameOverCanvas.enabled=
VRGameOverCanvas.enabled=
if(isGameOver){
GameOver(_didIWin);
保存所有并回到unity中填入两个游戏对象数组的值。
在层级面板中选择GameLogic 并在检视面板中下拉到Cardboard Swapper 组件。
对于Cardboard Objects 数组,给它一个1,然后填入场景中CardboardMain游戏对象的子对象Head 。这样不仅禁用了Cardboard Head以便回到top-down摄像机,同时还禁用了VRScoreCanvas 。
对于Mono Objects 数组,给它一个3,然后从场景中(不是从Assets中)选择Canvas,Main Camera和raccoon-ninja 。
29.png (20.05 KB, 下载次数: 4)
09:56 上传
最后,需要为用户在top-down画布添加一个按钮。为了节约时间,我已经为大家做好了——在预制件文件夹中。
将CardboardButton 从Assets\Prefabs 拖入到层级面板中并作为Canvas 对象的子集。确保它的Position 设置为(-50, 50, 0):
30.png (46.48 KB, 下载次数: 3)
09:56 上传
在按钮对象的下方,将它挂号以便点击按钮可以呼叫依附于GameLogic的CardboardSwapper.Switch()方法。可以根据下边的动画来观看是怎么完成的:
31.gif (1.13 MB, 下载次数: 3)
09:56 上传
给游戏另一个尝试。点击屏幕右下角的按钮来切换到VR模式,然后点击在Cardboard上显示的返回按钮(或者是在unity中点击Escape)来切换回top-down模式。
32.png (154.27 KB, 下载次数: 3)
09:56 上传
Congratulations! You’re swapping VR Modes like a boss!
33.png (33.9 KB, 下载次数: 3)
09:56 上传
该何去何从现在已经有能力在unity中做3D游戏了,并可以仅仅用一个小小的cardboard和一些塑料透镜来做成VR体验游戏。每个人都可以用VR!build process for 在IOS中几乎是一样的。Google的Unity Developer Guide 提供了一些额外的技术信息。最后,甚至可以在VR项目中加入Augmented Reality (AR) !还有,看一下任何可以在unity中制作的游戏,看有没有一些可以很好的转换为VR体验。或许这个教程激发大家创建一些全新的东西。像往常一样,在下边或论坛中随意写下你们的问题和评论!还有,你过你能解决怎样用意念控制割草机,请让我知道——我仍然在研究那个呢。
游客,如果您要查看本帖隐藏内容请
原文作者:Todd Kerpelman
原文链接:
扫描下方二维码关注官方微信~每日都有精选干货与你分享呦~
1.jpg (20.97 KB, 下载次数: 3)
17:35 上传
本文由蛮牛译馆倾情奉献,除 合作社区 及 合作媒体 外,禁止转载。
unity如何制作vr游戏;ununity 5.4unity 光标隐藏;虚拟现实应用虚拟现实对眼睛的伤害;虚拟现实v2;虚拟现实wp能用虚拟现实吗;unity vr游戏制作;gounity隐藏光标;虚拟现实虚拟现实伤害眼睛;v2虚拟现实是什么;v2虚拟现实;diy虚拟现实;wp有没有虚拟现实;wp怎么用虚拟现实
本帖被以下淘专辑推荐:
& |主题: 73, 订阅: 6
每日推荐:
72128/5000排名<font color="#FF昨日变化1主题帖子积分
日久生情, 积分 2128, 距离下一级还需 2872 积分
日久生情, 积分 2128, 距离下一级还需 2872 积分
蛮牛币4184
在线时间677 小时
用unity和Google Cardboard制作VR游戏,值得技术宅们看一看,动手学习哦+++++1
每日推荐:
9排名27昨日变化主题帖子积分
在线时间1411 小时
好麻烦。。。。。。。。。。。。。
每日推荐:
72225/5000排名<font color="#FF昨日变化2主题帖子积分
日久生情, 积分 2225, 距离下一级还需 2775 积分
日久生情, 积分 2225, 距离下一级还需 2775 积分
蛮牛币2038
在线时间584 小时
Google的Unity Developer Guide 提供了一些额外的技术信息。
每日推荐:
61403/1500排名<font color="#FF昨日变化3主题帖子积分
蛮牛粉丝, 积分 1403, 距离下一级还需 97 积分
蛮牛粉丝, 积分 1403, 距离下一级还需 97 积分
蛮牛币1281
在线时间536 小时
每日推荐:
71615/5000排名<font color="#FF昨日变化2主题帖子积分
日久生情, 积分 1615, 距离下一级还需 3385 积分
日久生情, 积分 1615, 距离下一级还需 3385 积分
蛮牛币3592
在线时间620 小时
ljhbljhbljhbljhbljhbljhbljhbljhbljhbljhbljhbljhbljhbljhbljhbljhb
每日推荐:
71615/5000排名<font color="#FF昨日变化2主题帖子积分
日久生情, 积分 1615, 距离下一级还需 3385 积分
日久生情, 积分 1615, 距离下一级还需 3385 积分
蛮牛币3592
在线时间620 小时
,你们, 闽南,vnm,jmmmmmmmmmmmmmmmmmmm
每日推荐:
7排名<font color="#FF昨日变化1主题帖子积分
在线时间367 小时
好长啊!!很给力。
每日推荐:
124/50排名<font color="#FF昨日变化15主题帖子积分
注册看看, 积分 24, 距离下一级还需 26 积分
注册看看, 积分 24, 距离下一级还需 26 积分
在线时间9 小时
用unity和Google Cardboard制作VR游戏,值得技术宅们看一看,动手学习哦+++++1
每日推荐:
61312/1500排名<font color="#FF昨日变化6主题帖子积分
蛮牛粉丝, 积分 1312, 距离下一级还需 188 积分
蛮牛粉丝, 积分 1312, 距离下一级还需 188 积分
蛮牛币5239
在线时间494 小时
看看&&翻译的技术帖&&并且带有原文链接&&路过给个赞
[]: 一个袋子砸在了 fairyzoro 头上,fairyzoro 赚了 1
每日推荐:
285/150排名<font color="#FF昨日变化43主题帖子积分
初来乍到, 积分 85, 距离下一级还需 65 积分
初来乍到, 积分 85, 距离下一级还需 65 积分
在线时间66 小时
赞一个,虽然没怎么看懂~~
每日推荐:
138/50排名<font color="#FF昨日变化21主题帖子积分
注册看看, 积分 38, 距离下一级还需 12 积分
注册看看, 积分 38, 距离下一级还需 12 积分
在线时间11 小时
...VR越来越平民化了
每日推荐:
4485/500排名<font color="#FF昨日变化3主题帖子积分
四处流浪, 积分 485, 距离下一级还需 15 积分
四处流浪, 积分 485, 距离下一级还需 15 积分
蛮牛币1405
在线时间175 小时
学习~~~~~~~~~~~~~~~~
每日推荐:
72447/5000排名<font color="#FF昨日变化1主题帖子积分
日久生情, 积分 2447, 距离下一级还需 2553 积分
日久生情, 积分 2447, 距离下一级还需 2553 积分
蛮牛币3960
在线时间628 小时
不错 ................................
[]: lijian5073 被钱袋砸中进医院,看病花了 1
每日推荐:
71952/5000排名<font color="#FF昨日变化主题帖子积分
日久生情, 积分 1952, 距离下一级还需 3048 积分
日久生情, 积分 1952, 距离下一级还需 3048 积分
蛮牛币6090
在线时间495 小时
很好。从没有过的体验
[]: wuzhialex 发帖时在路边捡到 1
蛮牛币,偷偷放进了口袋.
每日推荐:
经过游戏蛮牛认证的蛮牛小翻译
游戏蛮牛给予质量较高、影响力较大的unity相关技术开发者的荣誉称号
七夕浪漫情人
2015年蛮牛社区浪漫七夕 最美情话活动获奖者
社区QQ达人
使用QQ帐号登录论坛的用户
连续签到30天
蛮牛论坛干货区作者
认证开发者
经过游戏蛮牛认证的独立开发者

我要回帖

更多关于 unity3d制作vr游戏 的文章

 

随机推荐