怎样使用Unity和google vr cardboardd制作一款VR游戏

点击上方“VR视界”关注我们在今天的VR游戏开发分享,我们一起来看看国外VR开发者Daniel Borowski如何在七分种内开发一款VR游戏现在我们来做一款可以在Android和iOS上运行的VR游戏,使用的工作是Unity插件。这是一个简单的游戏:我们将在Google Cardboard Unity Demo中增加一个自动行走的功能,然后再增加一个可以凝视2秒传送物体的能力,但不是所有的VR头显都有Cardboard上的磁铁开关。Unity这是我们用来做这款游戏用到的引擎。Google Cardboard Unity PluginUnity plugin是谷歌开发的一个插件,可以用来向游戏中增加一些特定的功能,比如头部追踪,立体声渲染,输入检测等等。这个插件需要Android SDK支持。用C#语言来写的角色控制代码Unity提供的角色控制器组件可以让我们很容易做一个第一人称游戏,但Unity代码是用JavaScript写的,而Cardboard Unity插件代码是由C#语言写的。如果全部用C#语言来写,那么我们会很容易将两种脚本进行沟通。因此,我们将用C#语言重写角色控制器代码。创建游戏现在打开Unity,创建一个新项目。我们给它命名为firstgame,然后导入以下组件包:Skyboxes和Terrain Assets。打开Unity后,导入Google Unity包文件,操作如下:Assests & Import Package & Custom Package。然后选择Google Unity Plugin插件。在项目窗口中你可以在Assets文件下里看到一个Cardboard文件夹。打开这个文件夹,再打开DemoScene文件夹,双击DemoScene后你的项目会像这样:在层级目录窗口中,展开CardboardMain & Head & Main Camera,选中Main Camera。现在,如果运行游戏,你可以在Inspector窗口下对立体乘数(strereo multiplier)进行实时修改。立体声乘数影响游戏中的立体效果。如果你看到双重图像的话,其中一个解决办法是改变立体乘数的参数。其它造成这个问题的原因也可能是头显的两片目镜间距,以及目镜与手机的距离需要进行调整。还是在MainCamera选中的情况下,在Inspector窗口中,点击Add Component,选择Rendering & skybox。然后点击None(Material)旁边的小圆圈,之后skyboxes会出现。双击其中任意一个(我选择的是Eerie Skybox)然后在游戏窗口中选择地面,在Inspector窗口里选择 Mesh Render & Materials,选择Element(0)旁的小圆圈,然后选择Grass Hill材质。按住Alt键可以在场景中四处查看。尝试在游戏中移动在你的项目窗口,点击Assets文件夹,右键,然后选择Import New Asset,然后选择CharacterMotor.cs和FPSInputController.cs文件。然后在层级窗口选择Head,拖动FPSinputController脚步到Inspector窗口(Character Controller和Character Motor脚本文件应该会自动被添加)。然后从层级窗口删除CardboardGUI。之后你应该会看到如下效果:现在运行一下游戏,可以用WASD键来控制移动方向。添加自动行走功能很多移动VR游戏都带有自动移动功能,在没有手柄或键盘控制的情况下会很方便。自动移动是这样工作的:如果玩家凝视某个物体2-3秒,就会朝着当前方向触发自动移动,如果再次凝视,则会停止自动移动。接下来让我们在开发中也加上试试:选择Game Object & 3D Object & Sphere,创建一个sphere命名为autowalk。选中这个autowalk sphere,在Inspector窗口中点击增加元素,选择New Script(新建脚本)命名为Autowalk,然后选择CSharp语言。之后双击这个新建的文件,可以打开MonoDevelop,然后把下面的代码复制进去。Autowalk.csusing UnityEusing System.Cpublic class Autowalk : MonoBehaviour {private CardboardHprivate Vector3 startingPprivate float delay = 0.0f;void Start() {head = Camera.main.GetComponent&StereoController&().HstartingPosition = transform.localP}void Update() {RaycastHbool isLookedAt = GetComponent&Collider&().Raycast(head.Gaze, out hit, Mathf.Infinity);// if looking at object for 2 seconds, enable/disable autowalkif (isLookedAt && Time.time&delay) {GameObject FPSController = GameObject.Find(“Head”);FPSInputController autowalk = FPSController.GetComponent&FPSInputController&();autowalk.checkAutoWalk = !autowalk.checkAutoWdelay = Time.time + 2.0f;}// currently looking at objectelse if (isLookedAt) {GetComponent&Renderer&().material.color = Color.}// not looking at objectelse if (!isLookedAt) {GetComponent&Renderer&().material.color = Color.delay = Time.time + 2.0f;}}}这段代码的作用是在没有凝视物体时,将autowalk sphere的颜色设为红色,延迟变量为2秒。如果玩家看着目标物体,没有超过2秒,则sphere会变成黄色,一旦超过2秒,则会触发自动移动。你可以在场景的任何地方放置这个sphere。现在在游戏中测试一下,自动移动触发还是停止基于当前你是在移动中还是静止状态。如何不借助磁力输入来实现传输方块Google Cardboard侧面有一个磁力控制装置,但并非所有的VR头盔都有这个东西。因此要想实现传送效果,我们可以基于凝视系统来做——凝视物体2秒来传输。点击层级窗口的Cube(方块),你可以看到一个传送脚本。双击这个脚本打开MonoDevelop,复制下面的代码Teleport.csusing UnityEusing System.C[RequireComponent(typeof(Collider))]public class Teleport : MonoBehaviour {private CardboardHprivate Vector3 startingPprivate float delay = 0.0f;void Start() {head = Camera.main.GetComponent&StereoController&().HstartingPosition = transform.localP}void Update() {RaycastHbool isLookedAt = GetComponent&Collider&().Raycast(head.Gaze, out hit, Mathf.Infinity);GetComponent&Renderer&().material.color = isLookedAt ? Color.green : Color.if (!isLookedAt) { delay = Time.time + 2.0f; }if ((Cardboard.SDK.CardboardTriggered && isLookedAt) || (isLookedAt && Time.time&delay)) {// Teleport randomlyVector3 direction = Random.onUnitSdirection.y = Mathf.Clamp(direction.y, 0.5f, 1f);float distance = 2 * Random.value + 1.5f;transform.localPosition = direction *}}}生成可运行的应用完成上述操作后,现在我们已经准备好在手机上测试一下效果了。点击File & Buidling Settings1,点击Android,按下Switch Platform(平台转换)2,点击Add Current按钮(添加当前),把当前场景进行添加3,点击Player Settings(运行设置)按钮,并在Resolution and Presentation(分辨率和显示) & Default Orientation(默认方向)下选择Landscape Left(平板模式左)4,在Other Settings(其它设置)里为游戏添加一个Bundle Identifier(捆绑标识符),例如com.first.game设定完成后,你可以在游戏目录下发现一个APK格式的文件,现在就放入手机试试看吧。VR视界(gh_6d1c4ecdaf1a) 
 文章为作者独立观点,不代表微头条立场
的最新文章
今日VR资讯精选许多创业公司背后都有一段关于初心的故事。一群充满志向的年轻人聚集在一起,在草稿纸和黑板上描绘着未来的光景幻维世界今日正式宣布对上海喂啊网络科技有限公司进行投资,这是幻维世界自成立以来对VR内容制作公司的第十四次投资,也是投资额度及估值最高的一次投资。新朋友点上方蓝字“VR视界”快速关注今日资讯精华阅读,这些值得关注:1,Insta360获苏宁战略投资2,为设计VR游戏意味着你需要理解并认识到如何使用这项技术,而不是一开始就抗拒它,或想着将现有的设计模式复用进来。Fingo感知交互模组支持手势追踪识别,位置追踪以及可在VR与AR不同模式之间进行切换。目前已开启测试版的预售。今日VR资讯精选在VR化的过程中,将某个特定情节或场景做成VR体验,也是最大化IP价值的一种方式。搜狐视频作为行业第一个战略性推动VR自媒体内容发展的网络视频平台,将调动搜狐矩阵资源,大规模战略投入扶植VR出品人,提供全方位支持,打造完整的生态系统,力求引领VR元年内容时代。今日VR资讯精选上海和北京或许将成为世界VR的中心,就像好莱坞是世界工业电影的中心一样。自2015年9月开始,VRLe内容平台累计B端用户2057个,付费累计人次达到524万。什么时候VR市场才能出现一款爆款游戏?相信这是所有游戏人都特别关注的话题。今日VR资讯看点我们的愿景,是希望提供一款让所有人都负担的起的全沉浸移动VR方案。今日VR资讯精选在这场“内容为王”的用户争夺战中,3D/VR资源聚合平台3D东东App最被看好。附上每个时期的简介。今日VR资讯精选虽然《夜幕降临》既唯美又奇特,但它也确实令许多VR内容制作者受到了挑战:舞蹈情节要怎么设计?我作为旁观者,应该是站在什么样的角度?作为今年国内数字娱乐产业最高规格的一次行业精英交流项目,出席本届峰会嘉宾阵容规模空前。他认为VR产业发展不及预期,目前缺乏能够变现的商业模式。steam上使用Oculus Rift CV1的用户数激增,显然盖过了HTC Vive市场份额的增长。我认为VR行业只需要一种优雅的交互方案,但是它还没有出现,这是为什么VR没有爆发的第一个原因。Tension VR计划将VR体验带给更多的人,他们为此针对不同的用户群体准备了不同的体验方案审核通过的申请者将在北京、台北或旧金山三个地方之一接受为期4个月的深度培训和相关支持,并在10月份培训结束后提交可用的产品。7月8日,英雄体育宣布成立英雄VR,正式进军虚拟现实。同时也宣布了公司以投资的方式与美国VR设备商Virtuix达成战略合作罗尚虎表示,VR的出现帮助我们超越对资讯形态的想象我们可以看出Oculus正在逐渐暴露的一种不甚成功的商业策略,而这策略正是收购它的Facebook公司对某种更优秀方案的追求所导致的结果。不要因为偶尔出现的问题就质疑一个新兴的行业。如果恐怖游戏仅仅只有环境和怪物,缺少将它们与玩家的沉浸感穿插起来的必要形式,那么《生化危机7》很难成为一款深度的作品新朋友点上方蓝字“VR视界”快速关注虚拟现实和增强现实领域资本继续升温,微软HoloLens竞争对手,国外A至于Xbox“天蝎”,目前仅仅是一个代号,关于正式的名称只有等到2017年秋季正式推出时才会揭晓。除此之外,Hines也确认了《辐射4》VR版将是一款第一人称RPG游戏,将在2017年登陆HTC Vive。曾经认为“VR是一种危险的媒介”的著名大导演斯皮尔伯格,最近也终于投身到VR叙事拍摄的浪潮中来了。作为传统硬件厂商的HTC不愿放弃机会,据悉正在亲自开发一款虚拟现实游戏。在与工作人员聊天中得知,6月份将会开启正式测试。会有更多的地图和玩法,以及枪械都会有所变更虚拟现实的浪潮正在席卷整个互联网行业,此次酷开非生态大内容发布会也没有出乎我们的意料,酷开也正式加入了VR浪潮大军一些数据研究公司已经开始降低他们对VR市场规模的预测结果。SuperData不止一次下调VR预期。正走向消费市场的VR到底怎么了?玩家可以通过本文中提到的方法来稍微改善一下Rift糟糕的分辨率问题。从2015年起,VR(虚拟现实,Virtual Reality)几乎点燃了整个互联网行业的激情,各大分析机构纷纷将VR/AR(增强现实,Augmented Reality)列为未来科技发展的重要技术趋势掌趣科技宣布战略投资国内VR用户平台87870,布局VR媒体和VR游戏分发。投资达到千万元,具体金额暂未公布。新朋友点上方蓝字“VR视界”快速关注随着谷歌公布VR平台Daydream,积极整合VR产业链上下游,打通硬件来看看今天VR圈里有哪些事情发生今年5月11日开幕的戛纳电影节上,虚拟现实不出所料地再次成为导演和制片人们尝试电影新形式的宠儿。Oculus希望今年有更多的开发者参与到VR开发中来Vico 给移动 VR 增加了一个类似 Kinect 的深度摄像头,追踪身体动作作为移动 VR 游戏的输入。市场调研机构Interactive Broadband Consulting Group在对8471名美国民众的调查问卷的结果显示,大约有54%对虚拟现实感兴趣的消费者认为这项新兴技术并非是华而不实的。新朋友点上方蓝字“VR视界”快速关注VREYES除了微信渠道外,还覆盖百度百家、今日头条、搜狐新闻、网易新闻伍经纬从投资的角度分享一下松禾资本对VR的一些思考。gh_6d1c4ecdaf1a服务于虚拟现实行业从业者的垂直科技媒体热门文章最新文章gh_6d1c4ecdaf1a服务于虚拟现实行业从业者的垂直科技媒体【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教程。想要用 Cardboard做出自己的VR游戏,你需要以下工具:
Unity专业版,版本5以上;一部智能机,可以是 5代以后的iOS设备,也可以是4.3以上版本的设备。需要说的是,本文假设你是在用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 \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()是做什么的:
你首先检查游戏是否在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 VRGameOverCpublic 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里的Event项目,点击增加组件按钮,并增加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游戏。

我要回帖

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

 

随机推荐