用unity做oculus rift unity游戏怎样改摄像机视野高度

unity oculus是通过什么选择摄像机_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
unity oculus是通过什么选择摄像机
我有更好的答案
这组游戏对象所有使用同一材质的在一个DrawCall来完成.5)
  (2:
  (1)MeshRenderer勾选Batching Static.0001)
  (4)场景烘焙,0。但是Drawcall一定是最大化合并的;
  之后就合并好了!
  区别:
  勾选Batching Static  DrawCall优化合并。
  代码创建的模型有可能需要调用此接口来优化,或者Tangent切线的话,2)与(2,单个物体只能不超过180点
  (3)游戏对象使用相同模型和材质时。
  (2)可以使用Mesh.Optimize() 优化模型。导入模型不需要调用此接口,0。可以自由移动旋转。但有以下使用要求,就会自动被合并。(重复使用同一个Mesh不计)
  (2) 单个物体可以不超过300点。
  一 Mesh Renderer
  分为Dynamic Batching和 Static Batching
  Dynamic Batching
  不需要任何操作,只要共享材质(即使是不同的Mesh模型也可以): 勾了即可
  (2)代码中使用UnityEngine,只有相同缩放(即xyz等比缩放,应使用Renderer:
  运行游戏后将一组游戏对象的多个模型会被动态合并为1个。
  但如果Shader使用了 UV0 UV1两套UV,而适合动态合并:
  (1) 模型文件共计点数不超过900,在MeshFilter里显示的是 Combined Mesh(bine(root).5, 所以使用lightmap的物体不会被合并
  (5)Shader不能使用多Pass:多Pass的Shader会破坏Dynamic Batching
  Static Batching
  原理。这些游戏对象运行后无法移动缩放旋转:scene)。合并后不能移动
  StaticBatchingUtility:
  合并到一个游戏对象下。合并后可以移动父节点游戏对象
  二 Skinned Mesh Renderer
  没有任何batching, 故不是人物的话尽量少用.5,Shader可以有法线UV,2:
  (1)修改Renderer.material将会创建一份新的material,2,浮点尾数可以有细微差)的会被合并。
  如
  (1,1,1)与(1,1,1)
  (2,2,2)与(2,2,2)
  (0.5,0.5,0.5)与 (0,并且不受动态合并的诸多限制(见下文详述)。
  注意:即使物体都使用了同样的模型,在batch后每一个物体都会创建一份模型对应的geometry,在新的Combined Mesh里。所以过多的batch会增加内存占用。例如场景里的树群就不适合Static Batch,在导入模型至Unity3d时已自动处理。
  实现方法,2:
  完全自动合并:烘焙后同材质将不会被烘焙。lightmap 有隐藏的材质参数:offset&#47.sharedMaterial来保持材质公用;scale.StaticBatchingUtility实现(可以在任何平台调用):
  1)将所有要合并的静态物体(不须勾Batching Static)放入统一一个root
  2)StaticBatchingUtility。
  注意,即DrawCall Batching. 通过减少Draw call数 和对显卡性能的消耗来提高性能
VpnVip资讯教程,软件使用平台。
操作系统/系统故障
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列22 years ago赞赏还没有人赞赏,快来当第一个赞赏的人吧!29收藏分享举报文章被以下专栏收录Learning by Playing,游戏改变…推荐阅读{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&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&:&https:\u002F\\u002Fkidscoding&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:8056,&avatar&:{&id&:&f9a1d3e049&,&template&:&https:\u002F\\u002F{id}_{size}.jpeg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\\u002Ff9a1d3e049_l.jpeg&,&articlesCount&:101},&state&:&accepted&,&targetPost&:{&titleImage&:&https:\u002F\\u002Ffa920c8a5a3bf4dc582c_r.jpg&,&lastUpdated&:,&imagePath&:&fa920c8a5a3bf4dc582c.jpg&,&permission&:&ARTICLE_PUBLIC&,&topics&:[],&summary&:&欢迎继续我们的学习。北京时间日凌晨,Oculus正式开放对首款消费版Rift产品CV1的预订。599刀的价格让很多VR粉丝心头一紧,不过想想第一代iPhone的价格也是这样,只能期待后续的版本降价了。\u003Cb\u003E筑基\u003C\u002Fb\u003E为了准备好学习使用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&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_ALL_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:602,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&https:\u002F\\u002Ffa920c8a5a3bf4dc582c_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&:&https:\u002F\\u002Fpeople\u002Feseedo&,&avatar&:{&id&:&7dd67dbfe&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:10925,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:317783}],&title&:&不知道怎么开发VR游戏?Unity5.3官方VR教程重磅登场-系列2&,&author&:&eseedo&,&content&:&\u003Cp\u003E欢迎继续我们的学习。\u003C\u002Fp\u003E\u003Cp\u003E北京时间日凌晨,Oculus正式开放对首款消费版Rift产品CV1的预订。599刀的价格让很多VR粉丝心头一紧,不过想想第一代iPhone的价格也是这样,只能期待后续的版本降价了。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E筑基\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E为了准备好学习使用Unity开发VR应用,我们首先要检查下自己的电脑硬件和软件配置是否满足要求。简单来说,显卡要NVIDIA GTX970或AMD290以上,CPU要Intel i5-459以上,内存8GB以上,要有两个USB3.0接口,一个USB2.0接口,一个HDMI 1.3接口。\u003C\u002Fp\u003E\u003Cp\u003E操作系统比较坑爹,不支持Mac,也不支持Linux。支持Win7,Win8,Win10。\u003C\u002Fp\u003E\u003Cp\u003E当然,还要把自己的显卡驱动升级到最新版本。\u003C\u002Fp\u003E\u003Cp\u003EOculus官方的检测地址:\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\u002Foculus.us5.\u002Ftrack\u002Fclick%3Fu%3D88dbdcbf84bbc2e%26id%3Db436d0da47%26e%3D86f0296884\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttp:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\u003Eoculus.us5.\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003E\u002Ftrack\u002Fclick?u=88dbdcbf84bbc2e&id=b436d0da47&e=86f3C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E关于电脑配置的相关信息,可以参考:\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\\u002F\u002F06\u002Foculus-rift%25E6%E5%25A4%25A9%25E5%25BC%%2590%25AF%25E9%25A2%%25AE%25A2%25EF%25BC%258C%25E4%25BD%25A0%25E7%259A%%%25E8%E9%E7%25BD%25AE%25E5%25A4%259F%25E4%25B8%258D%25EF%25BC%259F\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EOculus Rift明天开启预订,你的电脑配置够不?(新增官方检测工具地址)\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E一旦完成了这种烧钱的工作,就该安装Unity了。注意在打开Unity前要把DK2连接好并开启。 在继续之前,打开Oculus Configuration Utility应用,并检查Demo Scene可以正常运行。注意在运行Demo Scene之前看可能需要在Oculus Configuration Utility中设置一个新用户。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E创建第一个VR项目\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E接下来我们将使用Unity创建一个简单的VR项目demo,其效果是在VR头盔中观察一个立方体。如果你想研究更多VR示例,不妨下载我们在上一篇教程中提到的VR示例项目(\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fwww.\u002F%23%21\u002Fcontent\u002F51519\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EAsset Store\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E)。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002F6d1c5fd0c3f631d755eca5d00cbf4370_b.png\& data-rawwidth=\&1017\& data-rawheight=\&678\& class=\&origin_image zh-lightbox-thumb\& width=\&1017\& data-original=\&https:\u002F\\u002F6d1c5fd0c3f631d755eca5d00cbf4370_r.png\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='1017'%20height='678'&&\u002Fsvg&\& data-rawwidth=\&1017\& data-rawheight=\&678\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&1017\& data-original=\&https:\u002F\\u002F6d1c5fd0c3f631d755eca5d00cbf4370_r.png\& data-actualsrc=\&https:\u002F\\u002F6d1c5fd0c3f631d755eca5d00cbf4370_b.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EStep 1.\u003C\u002Fp\u003E\u003Cp\u003E打开Unity,创建一个新的空项目。\u003C\u002Fp\u003E\u003Cp\u003E说明一下,我当前用的Unity版本是5.3.1f1,可能你看到这篇教程的时候又已经升级换代了。\u003C\u002Fp\u003E\u003Cp\u003EStep 2.\u003C\u002Fp\u003E\u003Cp\u003E在Unity的菜单中选择Fiel- Build Settings,并选中PC,Mac& Linux Standalone\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002F86b9fd9e81c9c853f1ae02e2_b.png\& data-rawwidth=\&551\& data-rawheight=\&593\& class=\&origin_image zh-lightbox-thumb\& width=\&551\& data-original=\&https:\u002F\\u002F86b9fd9e81c9c853f1ae02e2_r.png\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='551'%20height='593'&&\u002Fsvg&\& data-rawwidth=\&551\& data-rawheight=\&593\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&551\& data-original=\&https:\u002F\\u002F86b9fd9e81c9c853f1ae02e2_r.png\& data-actualsrc=\&https:\u002F\\u002F86b9fd9e81c9c853f1ae02e2_b.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EStep 3.\u003C\u002Fp\u003E\u003Cp\u003E在场景中创建一个新的立方体,从菜单中选择Game Object - 3D Object -Cube ,通过Translate工具把立方体放到默认的Main Camera 前面,类似下面。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002F55fcb10ef9b74bffd03d734_b.png\& data-rawwidth=\&700\& data-rawheight=\&659\& class=\&origin_image zh-lightbox-thumb\& width=\&700\& data-original=\&https:\u002F\\u002F55fcb10ef9b74bffd03d734_r.png\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='700'%20height='659'&&\u002Fsvg&\& data-rawwidth=\&700\& data-rawheight=\&659\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&700\& data-original=\&https:\u002F\\u002F55fcb10ef9b74bffd03d734_r.png\& data-actualsrc=\&https:\u002F\\u002F55fcb10ef9b74bffd03d734_b.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EStep 4.保存界面(File- Save Scene,或是使用快捷键)。\u003C\u002Fp\u003E\u003Cp\u003EStep 5.在菜单中选择Edit- Project Settings - Player,在”Other Settings“部分勾选”Virtual Reality Supported”\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002Ffe0c4bd654cfdfce7329800_b.png\& data-rawwidth=\&354\& data-rawheight=\&769\& class=\&content_image\& width=\&354\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='354'%20height='769'&&\u002Fsvg&\& data-rawwidth=\&354\& data-rawheight=\&769\& class=\&content_image lazy\& width=\&354\& data-actualsrc=\&https:\u002F\\u002Ffe0c4bd654cfdfce7329800_b.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EStep 6.点击Unity界面上的Play按钮进入Play模式。\u003C\u002Fp\u003E\u003Cp\u003E如果之前的设置没有问题,现在你应该可以通过DK2看到这个场景,四处看看,Unity中的摄像机将自动根据DK2的位置和旋转变化反应。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E出错了怎么办?\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E如果你没有在DK2中看到期望的场景,那么检查以下的事项:\u003C\u002Fp\u003E\u003Cp\u003E1.确保你在打开Unity项目前就已经把DK2接好并且开启了。\u003C\u002Fp\u003E\u003Cp\u003E2.打开Oculus自带的Oculus Configuration Utility,看看Demo Scene是不是可以正常运作\u003C\u002Fp\u003E\u003Cp\u003E3.更新你的显卡驱动到最新版本\u003C\u002Fp\u003E\u003Cp\u003E4.确保你在电脑上装了最新的Oculus Runtime 0.8,或更高版本。\u003C\u002Fp\u003E\u003Cp\u003E当然,如果还是有问题,可以到论坛里面参与讨论。\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\\u002Fforums\u002Fvirtual-reality.80\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EVirtual Reality\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003E关于VR开发的一些有用信息:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E虽然VR应用开发和标准Unity应用开发很相似,不过还是有些区别需要注意的。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E1.编辑器中显示的帧速(Frame rate)\u003C\u002Fp\u003E\u003Cp\u003E当你通过编辑器查看项目时,注意体验上可能有些延迟,因为电脑需要将同样的内容渲染两次。所以在实际测试项目的时候,最好创建一个可执行版本,在测试设备上实际体验。\u003C\u002Fp\u003E\u003Cp\u003E2.摄像机的移动\u003C\u002Fp\u003E\u003Cp\u003E注意,我们不能在Unity中直接移动VR摄像机。如果你希望调整摄像机的位置和旋转,需要确保将它设置为其它游戏物体GameObject的子物体,然后通过所依附的物体进行移动。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002Fceb14ddb96c33_b.png\& data-rawwidth=\&124\& data-rawheight=\&74\& class=\&content_image\& width=\&124\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='124'%20height='74'&&\u002Fsvg&\& data-rawwidth=\&124\& data-rawheight=\&74\& class=\&content_image lazy\& width=\&124\& data-actualsrc=\&https:\u002F\\u002Fceb14ddb96c33_b.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E关于这一点,可以查看VR Samples项目中的Flyer和Maze场景。\u003C\u002Fp\u003E\u003Cp\u003E3.相机节点\u003C\u002Fp\u003E\u003Cp\u003E左眼和右眼的摄像机并不是由Unity创建的。如果你在开发中需要获取这些节点的位置,则必须使用InputTracking类。\u003C\u002Fp\u003E\u003Cp\u003E如果你想要获取场景中眼睛的不同位置(比如测试时),请使用下面的示例脚本,并将其attach到摄像机上。\u003C\u002Fp\u003E\u003Cp\u003EC#脚本\u003C\u002Fp\u003E\u003Cp\u003Eusing UnityE\u003C\u002Fp\u003E\u003Cp\u003Eusing UnityEngine.VR;\u003C\u002Fp\u003E\u003Cp\u003Epublic class UpdateEyeAnchors : MonoBehaviour\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
GameObject[] eyes = new GameObject[2];\u003Cbr\u003E
string[] eyeAnchorNames ={ \&LeftEyeAnchor\&, \&RightEyeAnchor\& };void Update()\u003C\u002Fp\u003E\u003Cp\u003E
\u003Cbr\u003E
for (int i = 0; i & 2; ++i)\u003C\u002Fp\u003E\u003Cp\u003E
{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F If the eye anchor is no longer a child of us, don't use it\u003C\u002Fp\u003E\u003Cp\u003E
if (eyes[i] != null && eyes[i].transform.parent != transform)\u003C\u002Fp\u003E\u003Cp\u003E
{\u003C\u002Fp\u003E\u003Cp\u003E
eyes[i] =\u003C\u002Fp\u003E\u003Cp\u003E
}\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F If we don't have an eye anchor, try to find one or create one\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E
if (eyes[i] == null)\u003C\u002Fp\u003E\u003Cp\u003E
{\u003C\u002Fp\u003E\u003Cp\u003E
Transform t = transform.Find(eyeAnchorNames[i]);\u003C\u002Fp\u003E\u003Cp\u003E
if (t)\u003C\u002Fp\u003E\u003Cp\u003E
eyes[i] = t.gameO\u003C\u002Fp\u003E\u003Cp\u003E
if (eyes[i] == null)\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E
{\u003C\u002Fp\u003E\u003Cp\u003E
eyes[i] = new GameObject(eyeAnchorNames[i]);\u003C\u002Fp\u003E\u003Cp\u003E
eyes[i].transform.parent = gameObject.\u003C\u002Fp\u003E\u003Cp\u003E
}\u003C\u002Fp\u003E\u003Cp\u003E
}\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F Update the eye transform\u003C\u002Fp\u003E\u003Cp\u003E
eyes[i].transform.localPosition = InputTracking.GetLocalPosition((VRNode)i);\u003C\u002Fp\u003E\u003Cp\u003E
eyes[i].transform.localRotation = InputTracking.GetLocalRotation((VRNode)i);\u003C\u002Fp\u003E\u003Cp\u003E
\u003C\u002Fp\u003E\u003Cp\u003E }\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E4.VR中的图像效果(Image Effect)\u003C\u002Fp\u003E\u003Cp\u003E在VR项目中使用众多图像效果是很奢侈的事情。考虑到你需要两次渲染同一个场景(每只眼睛一次),因此很多当前经常使用的图像效果对VR应用来说会很浪费,会严重影响游戏的运行帧速。\u003C\u002Fp\u003E\u003Cp\u003E因为VR将用户的眼睛置入一个虚拟的空间,因此部分图像效果对VR来说没有任何意义。举例来说,深度视角、模糊效应和镜头光晕效果对VR来说没有任何意义,因为在现实世界中我们是看不到这些效果的。不过如果以后VR头戴设备可以支持眼动跟踪,那么深度视角可能会有意义。\u003C\u002Fp\u003E\u003Cp\u003E不过有些效果还是可以考虑使用的:比如抗锯齿是有用的(特别是考虑到某些头戴设备的低分辨率),色彩分级也很有用(关于这一点可以查看这个链接:\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\\u002F\u002F12\u002Fcolor-grading-with-unity-and-the-asset-store\u002F\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EColor Grading with Unity and the Asset Store\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E ),对有些游戏来说Bloom会有用。不过在使用任何效果之前,最好先在游戏中实际测试下有没有用。\u003C\u002Fp\u003E\u003Cp\u003EUnity自身提供了很多图像效果(Assets-Import Package-Effects),此外Asset Store里面也提供了很多效果,比如Colorful,Chromatica,Amplify Color,还有更多。\u003C\u002Fp\u003E\u003Cp\u003E5.Render Scale\u003C\u002Fp\u003E\u003Cp\u003E根据VR互动应用场景的复杂度和所运行的硬件环境,你可能需要更改render scale设置。通过此项设置可以调整镜头校正前texel:pixel的比率,这样可以牺牲游戏性能来换取画面的清晰度。\u003C\u002Fp\u003E\u003Cp\u003E这项设置应该通过代码进行,可以参考这里:\u003C\u002Fp\u003E\u003Cp\u003E\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Fcn\u002FVRSettings.renderScale\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttp:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u002Fcn\u002FVRSettin\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003Egs.renderScale\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E通过使用以下代码可以改变render scale的设置:\u003C\u002Fp\u003E\u003Cp\u003Eusing UnityE\u003C\u002Fp\u003E\u003Cp\u003Eusing System.C\u003C\u002Fp\u003E\u003Cp\u003Eusing UnityEngine.VR;\u003C\u002Fp\u003E\u003Cp\u003Enamespace VRStandardAssets.Examples\u003C\u002Fp\u003E\u003Cp\u003E{ \u003C\u002Fp\u003E\u003Cp\u003E
public class ExampleRenderScale : MonoBehaviour\u003C\u002Fp\u003E\u003Cp\u003E
{\u003C\u002Fp\u003E\u003Cp\u003E
[SerializeField] private float m_RenderScale = 1f;
\u003C\u002Fp\u003E\u003Cp\u003E \u002F\u002FThe render scale. Higher numbers = better quality, but trades performance\u003C\u002Fp\u003E\u003Cp\u003E
void Start ()\u003C\u002Fp\u003E\u003Cp\u003E
{\u003C\u002Fp\u003E\u003Cp\u003E
VRSettings.renderScale = m_RenderS\u003C\u002Fp\u003E\u003Cp\u003E
}\u003C\u002Fp\u003E\u003Cp\u003E
}\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E关于这项设置,可以参考我们的VR Samples,具体示例是Scenes\u002FExamples\u002FRenderScale场景。此外在MainMenu场景中也有该项设置的应用。\u003C\u002Fp\u003E\u003Cp\u003E更改render scale的效果示例如下:\u003C\u002Fp\u003E\u003Cp\u003EUnity的默认render scale是1.0,效果如下:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002Fdff63b1fd874e5d864f734c_b.png\& data-rawwidth=\&650\& data-rawheight=\&441\& class=\&origin_image zh-lightbox-thumb\& width=\&650\& data-original=\&https:\u002F\\u002Fdff63b1fd874e5d864f734c_r.png\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='650'%20height='441'&&\u002Fsvg&\& data-rawwidth=\&650\& data-rawheight=\&441\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&650\& data-original=\&https:\u002F\\u002Fdff63b1fd874e5d864f734c_r.png\& data-actualsrc=\&https:\u002F\\u002Fdff63b1fd874e5d864f734c_b.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E如果将render scale设置成1.5,可以看到显示效果更锐利:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002F3cf6f80f08dfda27242bfa43ed4115c2_b.png\& data-rawwidth=\&650\& data-rawheight=\&441\& class=\&origin_image zh-lightbox-thumb\& width=\&650\& data-original=\&https:\u002F\\u002F3cf6f80f08dfda27242bfa43ed4115c2_r.png\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='650'%20height='441'&&\u002Fsvg&\& data-rawwidth=\&650\& data-rawheight=\&441\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&650\& data-original=\&https:\u002F\\u002F3cf6f80f08dfda27242bfa43ed4115c2_r.png\& data-actualsrc=\&https:\u002F\\u002F3cf6f80f08dfda27242bfa43ed4115c2_b.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E接下来把renderscale设置成0.5,可以看到像素化很严重:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002Fdaac560acd3bf818e0ba3cce_b.png\& data-rawwidth=\&650\& data-rawheight=\&441\& class=\&origin_image zh-lightbox-thumb\& width=\&650\& data-original=\&https:\u002F\\u002Fdaac560acd3bf818e0ba3cce_r.png\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='650'%20height='441'&&\u002Fsvg&\& data-rawwidth=\&650\& data-rawheight=\&441\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&650\& data-original=\&https:\u002F\\u002Fdaac560acd3bf818e0ba3cce_r.png\& data-actualsrc=\&https:\u002F\\u002Fdaac560acd3bf818e0ba3cce_b.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E根据游戏场景的不同,可以考虑降低render scale来提升游戏运行性能,或者通过增加render scale的数值让画面效果更锐利,但会以牺牲游戏运行性能作为代价。\u003C\u002Fp\u003E\u003Cp\u003E好了,看到这里,你应该知道如何在Unity项目中整合VR,如何设置游戏中摄像机的移动,以及和非VR游戏相比应该如何使用图像效果。\u003C\u002Fp\u003E\u003Cp\u003E在下一篇教程中,我们将学习如何跟场景中的物体进行交互,敬请期待~\u003C\u002Fp\u003E&,&updated&:new Date(&T09:13:46.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:13,&collapsedCount&:0,&likeCount&:29,&state&:&published&,&isLiked&:false,&slug&:&&,&lastestTipjarors&:[],&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002Ffa920c8a5a3bf4dc582c_r.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[],&adminClosedComment&:false,&titleImageSize&:{&width&:700,&height&:467},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&kidscoding&,&name&:&笨猫快乐学编程&},&tipjarState&:&activated&,&tipjarTagLine&:&真诚赞赏,手留余香&,&sourceUrl&:&&,&pageCommentsCount&:13,&tipjarorCount&:0,&annotationAction&:[],&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T17:13:46+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[{&bio&:&游戏幻想者&,&isFollowing&:false,&hash&:&b0bd3350&,&uid&:961000,&isOrg&:false,&slug&:&yige-ren-hao-pi&,&isFollowed&:false,&description&:&&,&name&:&一个人好坏&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fyige-ren-hao-pi&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&设计师&,&isFollowing&:false,&hash&:&b05393afc5c4a3c7cf323e&,&uid&:092100,&isOrg&:false,&slug&:&bridge9907&,&isFollowed&:false,&description&:&&,&name&:&bridge9907&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fbridge9907&,&avatar&:{&id&:&da8e974dc&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&想做策划的程序员&,&isFollowing&:false,&hash&:&c00a35f71a8e24cf201b2e0a4dc6dfde&,&uid&:477500,&isOrg&:false,&slug&:&wang-xi-zhuo-31&,&isFollowed&:false,&description&:&看过很多故事,才知道故事就真的只是故事。&,&name&:&屋檐下的猪&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fwang-xi-zhuo-31&,&avatar&:{&id&:&v2-e62fafaeda4fc8f79cdd4&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&: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&:&https:\u002F\\u002Fpeople\u002Ftmac-99&,&avatar&:{&id&:&v2-082fedfc421972dfb90c49c0e9be369f&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},{&bio&:&来学习的&,&isFollowing&:false,&hash&:&c72e1cdd38dbe2&,&uid&:20,&isOrg&:false,&slug&:&diego-zhang-21&,&isFollowed&:false,&description&:&&,&name&:&Diego Zhang&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fdiego-zhang-21&,&avatar&:{&id&:&eceb939e1fd2d7&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}],&summary&:&\u003Cimg src=\&https:\u002F\\u002F6d1c5fd0c3f631d755eca5d00cbf.png\& data-rawwidth=\&1017\& data-rawheight=\&678\& class=\&origin_image inline-img zh-lightbox-thumb\& data-original=\&https:\u002F\\u002F6d1c5fd0c3f631d755eca5d00cbf4370_r.png\&\u003E欢迎继续我们的学习。北京时间日凌晨,Oculus正式开放对首款消费版Rift产品CV1的预订。599刀的价格让很多VR粉丝心头一紧,不过想想第一代iPhone的价格也是这样,只能期待后续的版本降价了。\u003Cb\u003E筑基\u003C\u002Fb\u003E为了准备好学习使用Unity开发VR应用,我们首先要检…&,&reviewingCommentsCount&:0,&meta&:{&previous&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002F50\u002F92c0ed196ef08aed32b01_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&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&:&https:\u002F\\u002Fpeople\u002Feseedo&,&avatar&:{&id&:&7dd67dbfe&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&kidscoding&,&name&:&笨猫快乐学编程&},&content&:&\u003Cp\u003E如果你不是VR游戏或应用的开发者,可以选择无视下面的内容,这不是给普通用户看的~\u003C\u002Fp\u003E\u003Cp\u003E如果你之前曾经为Oculus Rift DK2或者Gear VR开发过,那么心里面一定曾经有千万个草泥马来回奔跑过。虽然Unity从5.1版本开始就支持VR应用和游戏开发,但是从Oculus和Unity双方的开发者论坛讨论情况看,大家都对双方互相推诿责任感到不满。\u003C\u002Fp\u003E\u003Cp\u003E如今,随着第一代消费级移动VR产品Samsung Gear VR正式推向市场,而三大核心主力设备也将悉数于2016年Q1和Q2粉墨登场,一向与时俱进的Unity再也坐不住了。\u003C\u002Fp\u003E\u003Cp\u003E就在今天,Unity官方在推出5.3版本的同时也推出了首个官方的VR开发教程。虽然不是很详细,但是对于苦逼了很久的开发者来说,简直就是仙音佛乐。\u003C\u002Fp\u003E\u003Cp\u003E废话少说,让我们来一起看看吧。\u003C\u002Fp\u003E\u003Cp\u003EPART I UNITY VR简介\u003C\u002Fp\u003E\u003Cp\u003EUnity内置对若干VR设备的支持,至于具体是哪些设备,不妨看看VRDeviceType这个枚举变量。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F2ac7793fe9faea32d802_b.jpg\& data-rawwidth=\&1374\& data-rawheight=\&910\& class=\&origin_image zh-lightbox-thumb\& width=\&1374\& data-original=\&http:\u002F\\u002F2ac7793fe9faea32d802_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E本教程主要针对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好了。\u003C\u002Fp\u003E\u003Cp\u003E当然,Unity也会在后续支持其它VR头戴设备,比如HTC VIVE。因此当那一天到来的时刻,这篇官方的教程也会随之更新的。老实说,Unity和Oculus真是一对好基友。\u003C\u002Fp\u003E\u003Cp\u003E如果想了解VR头戴设备的更多信息,建议去阅读官方的手册。\u003C\u002Fp\u003E\u003Cp\u003EPART II 在Unity项目中设置VR\u003C\u002Fp\u003E\u003Cp\u003E首先请下载最新的Oculus runtime 0.8或更高版本(\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\\u002Fdownloads\u002F\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttps:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u002Fdo\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003Ewnloads\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E ),以及最新的Unity5.3或更高版本(\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Fget-unity\u002Fdownload\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EUnity - Download\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E )。\u003C\u002Fp\u003E\u003Cp\u003E在项目中启用对VR的支持废除简单,只需要在Unity菜单中选择Edit & Project Settings& Player & Other Settings & Rendering\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F04cfd1eef04bb17331ea09_b.png\& data-rawwidth=\&473\& data-rawheight=\&764\& class=\&origin_image zh-lightbox-thumb\& width=\&473\& data-original=\&http:\u002F\\u002F04cfd1eef04bb17331ea09_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E然后在Inspector中勾选”Virtual Reality Supported“。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F6e74f5d6cbf5cfb5e032b2c97255aa1f_b.png\& data-rawwidth=\&559\& data-rawheight=\&199\& class=\&origin_image zh-lightbox-thumb\& width=\&559\& data-original=\&http:\u002F\\u002F6e74f5d6cbf5cfb5e032b2c97255aa1f_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E在runtime时,可以通过在代码中使用UnityEngine.VR.VRSettings.enabled属性来进行设置。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Fd1f35cc0cfda53cc36ca7_b.jpg\& data-rawwidth=\&1512\& data-rawheight=\&766\& class=\&origin_image zh-lightbox-thumb\& width=\&1512\& data-original=\&http:\u002F\\u002Fd1f35cc0cfda53cc36ca7_r.jpg\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EPART III 在Unity中预览VR场景\u003C\u002Fp\u003E\u003Cp\u003E当我们在Unity Editor中已经启用VR Support,而且连接上了DK2设备时,进入Play 模式就可以在DK2上显示游戏的场景。这样可以大大提高开发测试和迭代的效率。和之前不同,开发者无需编译生成一个可执行的项目才能看到VR应用或游戏的调整。当然,老司机们会发现此前的双眼视图已经被单一视图替代了。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Fea38a124b86eb9e61f21f8c_b.png\& data-rawwidth=\&687\& data-rawheight=\&551\& class=\&origin_image zh-lightbox-thumb\& width=\&687\& data-original=\&http:\u002F\\u002Fea38a124b86eb9e61f21f8c_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E需要提醒大家的是,我们没必要为每只眼睛都创建一个camera,所有的camera都会在VR中进行渲染,除了那些分配了Render Texture(渲染纹理)的摄像机。关于Render Textures,请参考这里(\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\\u002FManual\u002Fclass-RenderTexture.html\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EUnity - Manual: Render Texture\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E )。Unity会自动对摄像机的渲染进行优化,比如culling(剔除)和阴影渲染,从而减少性能消耗。\u003C\u002Fp\u003E\u003Cp\u003E关于VR的相关主题还可以在Unity Manual(\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\\u002FManual\u002FVROverview.html\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EUnity - Manual: VR Overview\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E )和Unity Scripting API(\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\\u002FScriptReference\u002F30_search.html%3Fq%3DVR\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EUnity - Scripting API:\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E ) 和中找到更多信息。\u003C\u002Fp\u003E\u003Cp\u003EPART IV 使用Unity进行VR开发的软硬件推荐\u003C\u002Fp\u003E\u003Cp\u003E因为VR是一个全新的媒介,所以在撰写本教程的时候存在着软硬件的限制,请参考以下内容。\u003C\u002Fp\u003E\u003Cp\u003E1.硬件\u003C\u002Fp\u003E\u003Cp\u003E为了让用户获得好的VR游戏体验,需要在头戴设备上实现所需的帧速。在DK2上的最小帧速是75fps,而在Gear VR上的最小帧速是60fps。如果帧速小于以上数值,那么用户会明显感觉到体验下降甚至导致晕眩。\u003C\u002Fp\u003E\u003Cp\u003E除了保持游戏帧速在一定的数值之上,玩家电脑上的GPU还必须具备足够的能力,可以按所需的分辨率以HMD头戴设备面板的刷新率输出。以DK2为例,就是需要做到75hz和。不过如果你想给Oculus Rift CV1开发应用,那么就必须实现90hz和的分辨率,这将是个巨大的挑战。\u003C\u002Fp\u003E\u003Cp\u003E如果你在使用DK2,那么需要确保硬件设备可以用所需的分辨率以所需的刷新率输出图像。很多笔记本电脑采用独立显卡和集成显卡切换的方式,但这些显卡基本上都无法满足以上要求,甚至连和75hz都实现不了,这样将严重影响用户体验。关于这部分内容,请参考Oculus的相关文档(\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\\u002Fhc\u002Fen-us\u002Farticles\u002F-Oculus-Rift-Development-Kit-2-FAQ\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EOculus Rift Development Kit 2 FAQ\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E ),以及Oculus PC配置指南(\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\\u002Fen-us\u002Foculus-ready-pcs\u002F\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttps:\u002F\u002Fwww.\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u002Fen-us\u002Foculus\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003E-ready-pcs\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E )。\u003C\u002Fp\u003E\u003Cp\u003E个人建议是:自己配一个高性能的PC,价格估计在1W2左右。\u003C\u002Fp\u003E\u003Cp\u003E2.软件\u003C\u002Fp\u003E\u003Cp\u003E苹果OS X操作系统:目前来说我们还是可以使用OSX 10.9以上的操作系统配合Oculus 0.0.5 runtime进行开发。但因为Oculus官方暂停了对OS X系统的支持,因此建议果粉们不要拍砖,还是老老实实用Windows系统,并使用Unity的原生VR功能。\u003C\u002Fp\u003E\u003Cp\u003EWindows: 支持Windows 7,8,8.1和windows 10.\u003C\u002Fp\u003E\u003Cp\u003EAndroid: 推荐使用android OS Lollipop 5.1或更高版本\u003C\u002Fp\u003E\u003Cp\u003E显卡驱动:请确保你的显卡驱动是最新的。可以使用Oculus Configuration Utility来检查显卡驱动是否够用。\u003C\u002Fp\u003E\u003Cp\u003EOculus Runtime:为了在Unity 5.3中进行VR开发,请使用Oculus Runtime 0.8或更高版本。\u003C\u002Fp\u003E\u003Cp\u003EPART V VR示例项目\u003C\u002Fp\u003E\u003Cp\u003E作为本教程的一部分,我们在Asset Store上免费提供了一个VR示例项目。该项目可以同时支持DK2和Gear VR,我们将根据Oculus硬件的迭代不断更新该示例项目,同时也会在将来考虑支持其它头戴设备。\u003C\u002Fp\u003E\u003Cp\u003E该示例项目的下载链接如下:\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fwww.\u002F%23%21\u002Fcontent\u002F51519\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EAsset Store\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E1.示例场景\u003C\u002Fp\u003E\u003Cp\u003E主要的示例场景包括:\u003C\u002Fp\u003E\u003Cp\u003E(1)Intro: 介绍场景,教用户学习基本的交互\u003C\u002Fp\u003E\u003Cp\u003E(2)Menu:菜单场景,可以选择迷你游戏来玩\u003C\u002Fp\u003E\u003Cp\u003E(3)Flyer:一个飞行小游戏\u003C\u002Fp\u003E\u003Cp\u003E(4)Maze:一个桌面迷宫游戏\u003C\u002Fp\u003E\u003Cp\u003E(5)Target Gallery:一个回廊射击游戏\u003C\u002Fp\u003E\u003Cp\u003E(6)Target Arena:一个360度射击竞技场游戏\u003C\u002Fp\u003E\u003Cp\u003E怎么样,Unity还是很厚道的吧?\u003C\u002Fp\u003E\u003Cp\u003E除了这些完整的小游戏之外,还有一些示例场景涵盖了本教程的一些重要概念:\u003C\u002Fp\u003E\u003Cp\u003E(1)InteractiveItem:演示了如何VR中和物体进行交互\u003C\u002Fp\u003E\u003Cp\u003E(2)RenderScale:演示了RenderScale将如何影响图像质量\u003C\u002Fp\u003E\u003Cp\u003E(3)Reticle: VR中 reticle的基本示例\u003C\u002Fp\u003E\u003Cp\u003E(4)Rotation:演示了物体将如何随头部运动做出响应\u003C\u002Fp\u003E\u003Cp\u003E(5)Touchpad:演示了如何使用Gear VR的触摸板进行交互。\u003C\u002Fp\u003E\u003Cp\u003E所涵盖的重要概念:\u003C\u002Fp\u003E\u003Cp\u003E(1)自顶向下的桌面游戏机制\u003C\u002Fp\u003E\u003Cp\u003E(2)朝屏幕内的星际火狐风格的射击游戏机制\u003C\u002Fp\u003E\u003Cp\u003E(3)回廊射击游戏机制\u003C\u002Fp\u003E\u003Cp\u003E(4)360度回廊射击游戏机制\u003C\u002Fp\u003E\u003Cp\u003E(5)如何在VR中设计界面\u003C\u002Fp\u003E\u003Cp\u003E(6)如何设计立体界面\u003C\u002Fp\u003E\u003Cp\u003E(7)在VR中和物体进行交互的基本框架,包括如何处理视线焦点的切换\u003C\u002Fp\u003E\u003Cp\u003E(8)reticle运动、缩放、阴影等\u003C\u002Fp\u003E\u003Cp\u003E(9)基于头部旋转的运动\u003C\u002Fp\u003E\u003Cp\u003E(10)如何使用Gear VR触摸屏,包括轻击、双击和滑动,或是在使用DK2时如何使用键盘鼠标进行交互。\u003C\u002Fp\u003E\u003Cp\u003E(11)如何判断设备时Gear VR还是DK2\u003C\u002Fp\u003E\u003Cp\u003E(12)如何在围绕中心点旋转摄像机时避免晕眩效应\u003C\u002Fp\u003E\u003Cp\u003E(13)如何实现摄像机的消隐\u003C\u002Fp\u003E\u003Cp\u003E(14)摄像机消隐的过渡\u003C\u002Fp\u003E\u003Cp\u003E(15)Object pooling(不知道咋翻译好)\u003C\u002Fp\u003E\u003Cp\u003E除了提供这些概念之外,为了方便VR开发者的重用,我们还提供了其它一些有用的示例:\u003C\u002Fp\u003E\u003Cp\u003E(1)摄像机的消隐\u003C\u002Fp\u003E\u003Cp\u003E(2)摄像机消隐的过渡\u003C\u002Fp\u003E\u003Cp\u003E(3)在VR中和物体进行交互的框架\u003C\u002Fp\u003E\u003Cp\u003E(4)Hold以确认交互\u003C\u002Fp\u003E\u003Cp\u003E(5)reticle运动和缩放\u003C\u002Fp\u003E\u003Cp\u003E(6)和平台无关的文本\u003C\u002Fp\u003E\u003Cp\u003E(7)指示特定方向的UI箭头\u003C\u002Fp\u003E\u003Cp\u003E(8)移动UI元素,使其始终面向摄像机\u003C\u002Fp\u003E\u003Cp\u003E(9)交互时倾斜UI物体。\u003C\u002Fp\u003E\u003Cp\u003E为了运行本项目,开发者需要使用Unity5.3.0或以上版本,拥有推荐配置以上的软硬件,拥有一台DK2或是搭配合适三星手机的Gear VR,同时要下载Oculus Runtime 0.8或以上版本。\u003C\u002Fp\u003E\u003Cp\u003EPART VI Oculus Unity Utilities\u003C\u002Fp\u003E\u003Cp\u003E作为补充,你也可以下载Oculus官方提供的Oculus Unity Utilities(\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\\u002Fdownloads\u002F\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttps:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u002Fdo\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003Ewnloads\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E )来实现一些特殊功能。其中包含了有用的脚本和预设,比如如何调整IPD(瞳间距)等等。\u003C\u002Fp\u003E\u003Cp\u003E本教程只关注原生Unity VR开发,因此对Oculus Unity Utilities,请参考Oculus官方网站以获取更多信息。(\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\\u002Fdownloads\u002Fgame-engines\u002F0.1.3.0-beta\u002FOculus_Utilities_for_Unity_5\u002F\& class=\& external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E\u003Cspan class=\&invisible\&\u003Ehttps:\u002F\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&visible\&\\u002Fdo\u003C\u002Fspan\u003E\u003Cspan class=\&invisible\&\u003Ewnloads\u002Fgame-engines\u002F0.1.3.0-beta\u002FOculus_Utilities_for_Unity_5\u002F\u003C\u002Fspan\u003E\u003Cspan class=\&ellipsis\&\u003E\u003C\u002Fspan\u003E\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E )\u003C\u002Fp\u003E\u003Cp\u003E好了,现在你已经知道自己需要哪些东西了。第一篇教程到此结束,在后续的时间里面我们将进一步学习如何开始VR开发。\u003C\u002Fp\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T10:46:38+08:00&,&url&:&\u002Fp\u002F&,&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&:44},&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002F50\u002F7ad35cf7b1ad7a9a8ba410_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&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&:&https:\u002F\\u002Fpeople\u002Feseedo&,&avatar&:{&id&:&7dd67dbfe&,&template&:&https:\u002F\\u002F50\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&kidscoding&,&name&:&笨猫快乐学编程&},&content&:&\u003Cp\u003E\u003Cb\u003E概览:\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E在VR项目中,我们需要在用户”凝视“某个物体时将其激活。在VRSamples中,我们构建了一个简单的,可拓展的轻度系统,让用户跟场景中的物体进行交互。其中包含了三个主要的脚本文件:VREyeRaycaster,VRInput和VRInteractiveItem,下面将对这三个重要的类进行简要的介绍。相关的源代码也做了注释。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EVREyeRaycaster\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F6a51cf1edcc7d_b.png\& data-rawwidth=\&599\& data-rawheight=\&178\& class=\&origin_image zh-lightbox-thumb\& width=\&599\& data-original=\&http:\u002F\\u002F6a51cf1edcc7d_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E该脚本需要和Main Camera关联。在每次调用Update()时,该脚本都会使用Physics.Raycast来投射一条射线,以确认该射线是否命中任何collider(碰撞体)。使用该脚本还可以排除特定的\u003Ca href=\&http:\u002F\\u002F?target=http%3A\u002F\\u002FManual\u002FLayers.html\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EUnity - Manual: Layers\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E-在某些场景中,我们可能为了性能考虑,把所有的可交互对象移到一个单独的层。\u003C\u002Fp\u003E\u003Cp\u003E如果某个碰撞体被射线命中,那么该脚本将尝试在GameObject上找到一个VRInteractiveItem组件。\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003EVRInteractiveItem interactible = hit.collider.GetComponent&VRInteractiveItem&();
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002Fattempt to get the VRInteractiveItem on the hit object\u003C\u002Fp\u003E\u003Cp\u003E从这里我们就可以判断用户究竟在”凝视“哪个物体,或是停止”凝视“某个物体。如果用户开始或停止”凝视“某个物体,那么我们就可以进行一些处理,比如调用一个方法。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EVRInput\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F29cdf77acba5fad440a7ed83_b.png\& data-rawwidth=\&568\& data-rawheight=\&73\& class=\&origin_image zh-lightbox-thumb\& width=\&568\& data-original=\&http:\u002F\\u002F29cdf77acba5fad440a7ed83_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EVRInput是个简单的类,可以判断用户在GearVR上(或是使用DK2时在PC上)所进行的一些简单操作,比如滑动、触碰、或双触。\u003C\u002Fp\u003E\u003Cp\u003E我们可以直接在VRInput上订阅事件:\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action&SwipeDirection& OnS
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called every frame passing in the swipe, including if there is no swipe.\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnC
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when Fire1 is released and it's not a double click.\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnD
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when Fire1 is pressed.\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnUp;
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when Fire1 is released.\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnDoubleC
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when a double click is detected.\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnC
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when Cancel is pressed.\u003C\u002Fp\u003E\u003Cp\u003E关于订阅事件的更多信息,请参考这里。\u003Ca href=\&http:\u002F\\u002F?target=http%3A\\u002Flearn\u002Ftutorials\u002Fmodules\u002Fintermediate\u002Fscripting\u002Fevents\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EUnity - Events\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EVRInteractiveItem\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E我们可以把该组件添加到任何希望在VR场景中进行交互的GameObject上,在该物体上需要绑定一个碰撞体。\u003C\u002Fp\u003E\u003Cp\u003E对此我们可以选择订阅六种不同的事件:\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnO
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when the gaze moves over this object\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnO
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when the gaze leaves this object\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnC
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when click input is detected whilst the gaze is over this object.\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnDoubleC
\u003C\u002Fp\u003E\u003Cp\u003E \u002F\u002F Called when double click input is detected whilst the gaze is over this object.\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnUp;
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when Fire1 is released whilst the gaze is over this object.\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action OnD
\u003C\u002Fp\u003E\u003Cp\u003E\u002F\u002F Called when Fire1 is pressed whilst the gaze is over this object.\u003C\u002Fp\u003E\u003Cp\u003E此外还有一个布尔值用于判断用户是否”凝视“在当前物体上?\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Epublic bool IsOver\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
get{ return m_IsO }
\u002F\u002F Is the gaze currently over this object?\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E我们也可以创建自己的脚本对以上事件作出响应。下面是一个简单的示例:\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Eusing UnityE\u003C\u002Fp\u003E\u003Cp\u003Eusing VRStandardAssets.U\u003C\u002Fp\u003E\u003Cp\u003Enamespace VRStandardAssets.Examples\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F This script is a simple example of how an interactive item can\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F be used to change things on gameobjects by handling events.\u003C\u002Fp\u003E\u003Cp\u003E
public class ExampleInteractiveItem : MonoBehaviour\u003C\u002Fp\u003E\u003Cp\u003E
{\u003C\u002Fp\u003E\u003Cp\u003E
[SerializeField] private Material m_NormalM
\u003C\u002Fp\u003E\u003Cp\u003E
[SerializeField] private Material m_OverM
\u003C\u002Fp\u003E\u003Cp\u003E
[SerializeField] private Material m_ClickedM
\u003C\u002Fp\u003E\u003Cp\u003E
[SerializeField] private Material m_DoubleClickedM
\u003C\u002Fp\u003E\u003Cp\u003E
[SerializeField] private VRInteractiveItem m_InteractiveI\u003C\u002Fp\u003E\u003Cp\u003E
[SerializeField] private Renderer m_R\u003C\u002Fp\u003E\u003Cp\u003E
private void Awake ()\u003C\u002Fp\u003E\u003Cp\u003E
{\u003C\u002Fp\u003E\u003Cp\u003E
m_Renderer.material = m_NormalM\u003C\u002Fp\u003E\u003Cp\u003E
}\u003C\u002Fp\u003E\u003Cp\u003E如果想看到实际的示例,不妨看看VRSampleScens\u002FScens\u002FExamples\u002F的InteractiveItem场景。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003ESelectionRadial和SelectionSlider\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E我们同时利用了radial选择条(SelectionRadial),以及选择滑动条(SelectionSlider),这样用户就可以按住Fire1来确认某个交互:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Fee0898faef581de805fd0_b.png\& data-rawwidth=\&524\& data-rawheight=\&457\& class=\&origin_image zh-lightbox-thumb\& width=\&524\& data-original=\&http:\u002F\\u002Fee0898faef581de805fd0_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Fc64fdee877_b.png\& data-rawwidth=\&622\& data-rawheight=\&290\& class=\&origin_image zh-lightbox-thumb\& width=\&622\& data-original=\&http:\u002F\\u002Fc64fdee877_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E当按住输入键时,选择条会进行填充,并在填充完整后分发OnSelectionComplete或OnBarFilled事件。关于此部分的代码,可以在SelectionRadial.cs和SelectionSlider.cs中找到,并进行了详细的注释。\u003C\u002Fp\u003E\u003Cp\u003E在VR的世界里,从用户交互的角度看,用户需要时刻知道自己在做什么,而且可以掌控一切。通过这种“held input”的确认输入方式,可以确保用户不会出现误操作。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EVR Sample项目中的交互示例\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E现在让我们来一起看看VR Sample项目中的部分交互示例。我们将提到每个场景中所使用的交互方式,以及具体实现的方式。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EMenu 场景中的交互\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E每个menu场景都包含了几个组件,其中我们需要重点关注的是MenuButton,VRInteractiveItem和Mesh Collider。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F0f4c53d5e819ceb89969d3_b.png\& data-rawwidth=\&624\& data-rawheight=\&240\& class=\&origin_image zh-lightbox-thumb\& width=\&624\& data-original=\&http:\u002F\\u002F0f4c53d5e819ceb89969d3_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EMenuButton组件订阅了VRInteractiveItem组件上的OnOver和OnOut事件,这样当十字准星移到menu上时,selection radial会出现。当用户的实现离开菜单选项时,selection radial会消失。而当selection radial可见,且用户按住Fire1键时,则radial会自动填充:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Fee0898faef581de805fd0_b.png\& data-rawwidth=\&524\& data-rawheight=\&457\& class=\&origin_image zh-lightbox-thumb\& width=\&524\& data-original=\&http:\u002F\\u002Fee0898faef581de805fd0_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E该类还订阅了OnSelectionRadial的OnSelectionComplete事件,这样当radial被填充满的时候,会调用HandleSelectionComplete。该方法的作用是让摄像机淡出,并调用所选的关卡。\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Eprivate void OnEnable ()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
m_InteractiveItem.OnOver += HandleO\u003C\u002Fp\u003E\u003Cp\u003E
m_InteractiveItem.OnOut += HandleO\u003C\u002Fp\u003E\u003Cp\u003E
m_SelectionRadial.OnSelectionComplete += HandleSelectionC\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003Eprivate void OnDisable ()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
m_InteractiveItem.OnOver -= HandleO\u003C\u002Fp\u003E\u003Cp\u003E
m_InteractiveItem.OnOut -= HandleO\u003C\u002Fp\u003E\u003Cp\u003E
m_SelectionRadial.OnSelectionComplete -= HandleSelectionC\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003Eprivate void HandleOver()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F When the user looks at the rendering of the scene, show the radial.\u003C\u002Fp\u003E\u003Cp\u003E
m_SelectionRadial.Show();\u003C\u002Fp\u003E\u003Cp\u003E
m_GazeOver =\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003Eprivate void HandleOut()\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F When the user looks away from the rendering of the scene, hide the radial.\u003C\u002Fp\u003E\u003Cp\u003E
m_SelectionRadial.Hide();\u003C\u002Fp\u003E\u003Cp\u003E
m_GazeOver =\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003Eprivate void HandleSelectionComplete()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F If the user is looking at the rendering of the scene when the radial's selection finishes, activate the button.\u003C\u002Fp\u003E\u003Cp\u003E
if(m_GazeOver)\u003C\u002Fp\u003E\u003Cp\u003E
StartCoroutine (ActivateButton());\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003Eprivate IEnumerator ActivateButton()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F If the camera is already fading, ignore.\u003C\u002Fp\u003E\u003Cp\u003E
if (m_CameraFade.IsFading)\u003C\u002Fp\u003E\u003Cp\u003E\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F If anything is subscribed to the OnButtonSelected event, call it.\u003C\u002Fp\u003E\u003Cp\u003E
if (OnButtonSelected != null)\u003C\u002Fp\u003E\u003Cp\u003E
OnButtonSelected(this);\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F Wait for the camera to fade out.\u003Cbr\u003E\u003C\u002Fp\u003E\u003Cp\u003E
yield return StartCoroutine(m_CameraFade.BeginFadeOut(true));\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F Load the level.\u003C\u002Fp\u003E\u003Cp\u003E
SceneManager.LoadScene(m_SceneToLoad, LoadSceneMode.Single);\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E让我们来看看Selection Radial的部分示例,注意截图中间的粉色元素:\u003C\u002Fp\u003E\u003Cp\u003EReticle only\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Feba7e48bc2c9279cce2dc4_b.png\& data-rawwidth=\&700\& data-rawheight=\&359\& class=\&origin_image zh-lightbox-thumb\& width=\&700\& data-original=\&http:\u002F\\u002Feba7e48bc2c9279cce2dc4_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E当用户“凝视”菜单选项时,空白的Selection Radial可见。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Fde47bcc248abd0b9_b.png\& data-rawwidth=\&700\& data-rawheight=\&389\& class=\&origin_image zh-lightbox-thumb\& width=\&700\& data-original=\&http:\u002F\\u002Fde47bcc248abd0b9_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003ESelection Radial 填充(当用户“凝视”菜单选项,且按下fire1输入键)\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F0f7d3cb33c1_b.png\& data-rawwidth=\&700\& data-rawheight=\&370\& class=\&origin_image zh-lightbox-thumb\& width=\&700\& data-original=\&http:\u002F\\u002F0f7d3cb33c1_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E在整个示例项目中,我们尝试用同样的风格,也就是使用bar和radial以固定的速度进行填充。在此建议大家在开发自己的VR项目时注意到这一点,因为交互设计中的连贯性对用户很重要,特别是对于VR这种新媒介。\u003C\u002Fp\u003E\u003Cp\u003EMaze场景中的交互\u003C\u002Fp\u003E\u003Cp\u003EMaze(迷宫)游戏中提供了一个桌面式的交互示例,其中我们可以指引游戏角色到出口,并避免触发炮塔。\u003C\u002Fp\u003E\u003Cp\u003E在选择角色的目的地时,会出现一个目的地标记,同时还会显示一个角色的路径。玩家可以通过在触摸板上使用swipe,按下方向键,或是使用游戏操纵杆上的左键来旋转视图。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Fc4292e9bea6_b.png\& data-rawwidth=\&700\& data-rawheight=\&421\& class=\&origin_image zh-lightbox-thumb\& width=\&700\& data-original=\&http:\u002F\\u002Fc4292e9bea6_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E在MazeFloor游戏对象上关联了MeshCollider和VRInteractiveItem,从而允许在VR场景中进行交互:\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F5c32c09e102f84c7e117c_b.png\& data-rawwidth=\&487\& data-rawheight=\&301\& class=\&origin_image zh-lightbox-thumb\& width=\&487\& data-original=\&http:\u002F\\u002F5c32c09e102f84c7e117c_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EMazeCourse 游戏对象是一个parent对象,其中包含了MazeFloor和MazeWalls GameObjects,这两个对象依次包含了迷宫布局中的几何信息。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F0f5fe48d2d40a5d719b8_b.png\& data-rawwidth=\&257\& data-rawheight=\&120\& class=\&content_image\& width=\&257\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EMazeCourse关联了一个MazeTargetSetting脚本,其中包含了对MazeFloor对象上VRInteractiveItem组件的引用。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Fe9f9e721bbc665ebec2594_b.png\& data-rawwidth=\&487\& data-rawheight=\&73\& class=\&origin_image zh-lightbox-thumb\& width=\&487\& data-original=\&http:\u002F\\u002Fe9f9e721bbc665ebec2594_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EMazeTargetSetting订阅了VRInteractiveItem上的OnDoubleClick事件,随后会分发OnTargetSet事件。该事件将把十字准星的Transform作为参数:\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Epublic event Action&Transform& OnTargetS
\u003C\u002Fp\u003E\u003Cp\u003E \u002F\u002F This is triggered when a destination is set.
\u003C\u002Fp\u003E\u003Cp\u003Eprivate void OnEnable()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
m_InteractiveItem.OnDoubleClick += HandleDoubleC\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003Eprivate void OnDisable()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
m_InteractiveItem.OnDoubleClick -= HandleDoubleC\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003Eprivate void HandleDoubleClick()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F If target setting is active and there are subscribers to OnTargetSet, call it.\u003C\u002Fp\u003E\u003Cp\u003E
if (m_Active && OnTargetSet != null)\u003C\u002Fp\u003E\u003Cp\u003E
OnTargetSet (m_Reticle.ReticleTransform);\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003EMazeCharacter游戏对象上的Player组件和MazeDestinationMarketGUI游戏对象上的DestinationMarker组件都会订阅该事件,并作出相应的响应。\u003C\u002Fp\u003E\u003Cp\u003E游戏角色可以使用Nav Mesh systems在迷宫中进行路径判断。Player组件使用HandleSetTarget函数来判断Nav Mesh Agent到十字准星间的方向,并更新Agent的轨迹-游戏角色路径的视觉渲染。\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Eprivate void HandleSetTarget(Transform target)\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F If the game isn't over set the destination of the AI controlling the character and the trail showing its path.\u003C\u002Fp\u003E\u003Cp\u003E
if (m_IsGameOver)\u003C\u002Fp\u003E\u003Cp\u003E
\u003C\u002Fp\u003E\u003Cp\u003E
m_AiCharacter.SetTarget(target.position);\u003C\u002Fp\u003E\u003Cp\u003E
m_AgentTrail.SetDestination();\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003EDestinationMarker可以将标记移动到Reticle的Transform位置:\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Eprivate void HandleTargetSet(Transform target)\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F When the target is set show the marker.\u003C\u002Fp\u003E\u003Cp\u003E
Show();\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F Set the marker's position to the target position.\u003C\u002Fp\u003E\u003Cp\u003E
transform.position = target.\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F Play the audio.\u003C\u002Fp\u003E\u003Cp\u003E
m_MarkerMoveAudio.Play();\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F Play the animation on whichever layer it is on, with no time offset.\u003C\u002Fp\u003E\u003Cp\u003E
m_Animator.Play(m_HashMazeNavMarkerAnimState, -1, 0.0f);\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E在下图中可以看到reticle,目的地标记,玩家和轨迹。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F470e01b7fcaf88d5ff1a3e_b.png\& data-rawwidth=\&700\& data-rawheight=\&350\& class=\&origin_image zh-lightbox-thumb\& width=\&700\& data-original=\&http:\u002F\\u002F470e01b7fcaf88d5ff1a3e_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E迷宫中的切换开关也是在VR中和物体进行交互的示例,其中用到了Collider,以及VRInteractiveItem,和SelectionSlider三个类。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F04fccbbbfe23efa_b.png\& data-rawwidth=\&487\& data-rawheight=\&444\& class=\&origin_image zh-lightbox-thumb\& width=\&487\& data-original=\&http:\u002F\\u002F04fccbbbfe23efa_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003E正如上图中显示的,和其它交互对象一起,SelectionSlider脚本会监听由VRInteractiveItem和VRInput所分发的事件。\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Eprivate void OnEnable ()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
m_VRInput.OnDown += HandleD\u003C\u002Fp\u003E\u003Cp\u003E
m_VRInput.OnUp += HandleUp;\u003C\u002Fp\u003E\u003Cp\u003E
m_InteractiveItem.OnOver += HandleO\u003C\u002Fp\u003E\u003Cp\u003E
m_InteractiveItem.OnOut += HandleO\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EFlyer场景中的交互\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003EFlyer场景是一个计时”无尽飞行”游戏,在其中玩家可以通过四处看来引导飞船的方向,并使用Fire1输入键进行射击,通过击中陨石或是引导飞船穿越空中的门来得分,跟Pilotwings或Starfox这两款游戏有点类似。\u003C\u002Fp\u003E\u003Cp\u003E在交互方面,Flyer使用了更简单的方式,也就是让FlyerLaserController订阅VRInput的OnDown事件,从而发射激光。\u003C\u002Fp\u003E\u003Cp\u003EC#脚本:\u003C\u002Fp\u003E\u003Cp\u003Eprivate void OnEnable()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
m_VRInput.OnDown += HandleD\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003Eprivate void HandleDown()\u003C\u002Fp\u003E\u003Cp\u003E{\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F If the game isn't running return.\u003C\u002Fp\u003E\u003Cp\u003E
if (!m_GameController.IsGameRunning)\u003C\u002Fp\u003E\u003Cp\u003E\u003C\u002Fp\u003E\u003Cp\u003E
\u002F\u002F Fire laser from each position.\u003C\u002Fp\u003E\u003Cp\u003E
SpawnLaser(m_LaserSpawnPosLeft);\u003C\u002Fp\u003E\u003Cp\u003E
SpawnLaser(m_LaserSpawnPosRight);\u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E\u003Cb\u003EShooter180和Shooter360场景中的交互(Target Gallery\u002F Target Arena)。\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E在VR Samples包含了两个射击游戏,其中一个是回廊射击游戏,玩家在180度视角的走廊中对潜在目标射击。另外还有一个竞技场射击游戏,玩家被类似X战警场景的潜在目标包围。\u003C\u002Fp\u003E\u003Cp\u003E这两款游戏中的每个目标对象都有一个Collider,VRInteractiveItem和ShootingTarget。\u003C\u002Fp\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002F2f0d90fd6bbfb6b264d6c_b.png\& data-rawwidth=\&529\& data-rawheight=\&456\& class=\&origin_image zh-lightbox-thumb\& width=\&529\& data-original=\&http:\u002F\\u002F2f0d90fd6bbfb6b264d6c_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cfigure\u003E\u003Cimg src=\&http:\u002F\\u002Fca3c70a97b5cd352ee0bdeda365c0c24_b.png\& data-rawwidth=\&486\& data-rawheight=\&294\& class=\&origin_image zh-lightbox-thumb\& width=\&486\& data-original=\&http:\u002F\\u002Fca3c70a97b5cd352ee0bdeda365c0c24_r.png\&\u003E\u003C\u002Ffigure\u003E\u003Cp\u003EShootingTarget组件订阅了VRInteractiveItem的OnDown事件,以判断目标是否被击中。该方法适用于瞬间命中(比如激光枪这种)的设定,如果要展示子弹时间,我们就需要考虑其它解决方案了。\u003C\u002Fp\u003E\u003Cp\u003E现在我们应该对基本的VR交互组件有了大概的印象,包括任何在VR Samples项目中具体使用这些组件。现在让我们来看看VR Samples项目中如何使用gaze(凝视)和reticles(十字星)。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EGAZE(凝视)\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cbr\u003E\u003Cp\u003E在VR应用中判断用户正在看什么很重要,可能是用于判断用户和游戏对象的交互,或是触发一个动画,也可能是向目标发射子弹。我们将VR中“看”这个动作定义为gaze(凝视),而在后续的教程中我们将频繁使用这个词。\u003C\u002Fp\u003E\u003Cp\u003E考虑到目前大多数HMD头戴设备还不支持眼部追踪,因此我们只能估计用户的gaze(凝视)。透镜的扭曲意味着用户正看着正前方,有一个简单的解决方案。正如在概览中提到的,我们只需要从摄像机的中心发射一条射线,然后找到这条射线所碰撞的物体即可。当然,这就意味着所有要被碰撞(或是需要通过“凝视”进行交互)的对象都必须关联一个Collider组件。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cb\u003EReticle(十字准星)\u003C\u002Fb\u003E\u003C\u002Fp\u003E\u003Cp\u003E十字准星用于辅助标记用户视野的中心。十字准星的样式可能是简单的点,也可能是一个十字准线,具体形式取决于项目需求。\u003C\u002Fp\u003E\u003Cp\u003E在传统的3D游戏中,十字准星被设置为空间中的固定点,比如通常是屏幕的中央。但是在VR中使用十字准星变得非常复杂:当用户在VR环境中四处观望时,双眼将汇集在靠近摄像机的物体上。如果十字准星处在一个固定的位置,那么用户会看到两个准星:我们在现实世界里面可以轻易模仿这种效果。把某个手指放在眼睛前面,然后聚焦到近处和远处的物体上。当我们聚焦在这个手指上时,就会看到两个背景,反之亦然。这就是传说中的\u003Ca href=\&http:\u002F\\u002F?target=https%3A\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDiplopia%23Voluntary\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003EDiplopia\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E 现象。\u003C\u002Fp\u003E\u003Cp\u003E为了避免用户在查看周围环境和注视不同距离的物体时看到两个准星,我们需要将准星放到3D空间的同一个点,也就是用户所关注对象的表面。\u003C\u002Fp\u003E\u003Cp\u003E将准星放在空间的这个点意味着从远处看准星将非常小

我要回帖

更多关于 unity oculus 的文章

 

随机推荐