一个简单的案例—VR及AR开发高级教程(9)

发表于:2017-3-29 10:16

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:吴亚峰、刘亚志、于复    来源:51Testing软件测试网原创

  7.5  一个简单的案例
  前面已经介绍了Gear VR诞生背景、开发前需要准备的工作、SDK概述以及对影响游戏性能的探究等,本节将要介绍的是通过开发一款集合菜单拾取、外部输入以及追踪光标等功能的案例,通过本案例的讲解使读者更加深入了解Gear VR应用的开发流程。
  7.5.1 案例功能简介
  本小节将要对本案例的主要功能进行简要介绍,由于目前Oculus Mobile SDK 0.6.1.0版本的SDK中未支持截图和录屏功能,因此只能向读者展示本案例在Unity编辑器中的运行效果图,有兴趣的读者可以安装本案例APK到手机上,插入Gear VR头盔实际体验。
  菜单拾取功能
  刚开始进入场景时正面可以看到主菜单,如图7-22所示,菜单上面有两个按钮,分别是:BOX SHOOTING和CYLINDER SHOOTING。调整头部姿态可以看到当黄色的光标拾取到两个按钮时字体颜色改变,当黄色光标离开时颜色恢复,如图7-23所示。
 
  侧面触摸监听功能
  当黄色的光标拾取到按钮时,可以通过单击Gear VR头盔侧面触摸版(如图7-19所示)实现头部转动,"BOX SHOOTING+单击触摸板"实现向右旋转90°,"CYLINDER SHOOTING+单击触摸板"实现向左旋转90°。
  追踪光标拾取功能
  当进入场景时,为便于在头部姿态发生改变时,体验者能够非常清楚地看到双眼在场景中注视的位置,以及方便拾取菜单、场景中的箱子和圆柱等,如图7-24和图7-25所示。追踪光标拾取功能的开发大大提高了本案例的交互性,增强了用户体验效果。
 
  7.5.2 VR场景搭建
  上一小节介绍了本案例的主要功能,本小节将要介绍的是VR场景搭建过程,场景搭建主要包括模型导入、灯光设置、纹理贴图以及摄像机调整等。具体搭建流程和使用Unity开发普通场景的步骤相同,只是在设置相机时略有不同,详细搭建步骤如下。
  (1)新建一个项目,并将其重命名为"GearVR_Demo",如图7-26所示,然后新建一个场景,将其命名为"Parlor",选中"Directional light",右击Delete,删除掉光照。向场景中导入准备好的模型资源,如图7-27所示。
  
  (2)单击"File-Bulid Settings..."弹出"Bulid Setting"对话框,选择Android平台,并且选择Texture Compression为"ETC2(GLES 3.0)"选项,单击Switch Platform切换平台,如图7-28所示。导入Oculus Mobile SDK的Unity插件UnityIntegration.unityPackage,如图7-29所示。
  
  (3)导入UnityIntegration.unityPackage之后,需要关闭Unity,打开OculusMobileSDK目录,找到/VrSamples /Unity /UnityIntegration/ ProjectSettings文件夹,如图7-30所示,把已经创建该项目工作区目录中的ProjectSettings文件夹(如图7-31所示)替换成Oculus Mobile SDK中的ProjectSettings文件夹。
  (4)在Hierarchy面板中选中新建场景时默认的Camera,右击Delete删除,把Assets/OVR/Prefabs目录下将OVRPlayerController预制体拖进场景中,如图7-32所示,并将其调整到合适的位置和视野,添加灯光,使场景变明亮。
  
  7.5.3 UGUI事件监听系统
  使用UGUI制作VR场景中的悬浮菜单和在搭建普通场景中的菜单是一样的,但是需要将画布(即Canvas)的Canvas组件中的Render Mode设置为World Space,这样当头部姿态发生改变时,菜单就会始终悬浮在世界坐标的固定位置,方便追踪光标拾取,具体开发步骤如下。
  (1)在Hierarchy的空白区域,右击→UI→Canvas,如图7-33所示,创建一个画布,用于菜单的显示,在该场景中需要3个画布,其中包括主菜单、Box返回按钮、Cylinder返回按钮,菜单结构图如图7-34所示。
 
  (2)创建完Canvas之后,在Hierarch面板中会自动生成EventSystem对象,EventSystem对于场景中UI事件监听非常重要,后面小节会详细介绍。主菜单Canvas中包括两个具有事件监听的按钮Right和Left,当光标位于按钮碰撞器之内时,字体变颜色,如图7-35所示。
  (3)场景中UGUI的事件监听系统离不开EventSystem对象,该对象下有3个组件:EventSystem、StandaloneInputModule、TouchInputModule,后面两个组件都继承自BaseInputModule,如图7-36所示。EventSystem组件主要负责处理输入、射线投射以及发送事件,场景中只能有一个EventSystem组件。
  
  BaseInputModule是一个基类模块,负责发送输入事件(单击、拖拽、选中等)到具体对象。EventSystem下的所有输入模块都必须继承自BaseInputModule组件。StandaloneInputModule和TouchInputModule组件是系统提供的标准输入模块和触摸输入模块,读者可以继承BaseInput Module实现自己的输入模块。
  (4)创建Canvas之后该UI对象上有3个组件:Canvas、Canvas Scaler、Graphic Raycaster,如图7-37所示。在Canvas组件中Render Mode有3个选项:Screen Space-Overlay、Screen Space-Camera、World Space,这里选择第三个选项World Space,保证Canvas在世界坐标空间中。
  (5)对于UI的事件系统来说,有了事件管理系统EventSystem、输入系统BaseInputModule以及画布Canvas之后,还需要BaseRaycaster对象负责确定目标对象,以及目标对象上的事件接收(EventTrigger)处理方法,如图7-38和图7-39所示。
 
  (6)Physics Raycaster组件继承于BaseRaycaster,在OVRPlayerController预制体中的CenterEyeAnchor上添加组件Physics Raycaster的同时,Unity会自动添加相机组件到该物体上(因为射线是由相机发出),为了防止该相机在场景中渲染物体而浪费不必要的资源,将其设置为未激活状态。
  (7)Event Trigger组件可以单击"Add New Event Type"按钮添加相应事件触发的接口,这里添加了Pointer Enter和Pointer Exit用来接收当Pointer进入对象时和当Pointer离开对象时的事件。通过开发Teleport.cs脚本来处理事件,具体代码如下。
  代码位置:见随书源代码/第7章/GearVR_Demo/Assets/Scripts目录下的Teleport.cs。
1     public class Teleport : MonoBehaviour {
2      public Text RightText;                       //BoxShooting Text
3      public Text LeftText;                        //Cylinder Shooting Text
4      public Text BoxStartText;                    //Box Shooting Menu Strt
5      public Image BoxBackImage;                   //Box Shooting Menu Back(Image)
6      public Image CylinderBackImage;        //Cylinder Shooting Menu Back(Image)
7      public void OnPointerEnter_Right(){    //射线拾取到BoxShooting按钮,颜色改变
8       Constraints.IsRaycaster_Right = true; //标志位置为ture,可以触发向右旋转事件
9       RightText.color = new Color (0.49f,0.07f,0.07f,1.0f);} //改变字体颜色
10     public void OnPointerEixt_Right(){    //射线离开BoxShooting按钮,字体变回原来颜色
11      Constraints.IsRaycaster_Right = false;      //标志位置为false,不可以触发旋转事件
12      RightText.color = new Color (0,0,0,1);}     //恢复字体原来颜色
13     public void OnPointerEnter_Left(){    //射线拾取到Throw Rring按钮,字体颜色改变
14      Constraints.IsRaycaster_Left = true; //标志位置为ture,可以触发向左旋转事件
15      LeftText.color = new Color (0.49f,0.07f,0.07f,1.0f);}  //改变字体颜色
16     public void OnPointerEixt_Left(){     //射线离开Throw Rring按钮,字体变回原来颜色
17      Constraints.IsRaycaster_Left = false;        //标志位置为ture,不可以触发旋转事件
18      LeftText.color = new Color (0,0,0,1);        //恢复字体原来颜色
19       /*此处省略了相似的方法代码,有兴趣的读者可以查看代码进行学习*/
20    }}
  第1~6行为声明用以触发事件的按钮或者图片的引用,其中主要包括:主菜单上的BoxShooting和CylinderShooting两个Button以及BoxBackImage和CylinderBackImage两个用以返回的图片。主菜单上的两个按钮,当单击侧面触摸板时,会发生相应旋转。
  第7~20行为当射线光标进入某UI碰撞器范围内时和当射线光标离开碰撞器范围内时用于处理事件的方法,其中OnPointerEnter_XXX方法表示光标进入、OnPointerEixt_XX方法表示光标离开,光标进入时该UI颜色改变以作区分,光标离开时颜色恢复为原来颜色。
本文选自《VR及AR开发高级教程—基于Unity》第七章,本站经人民邮电出版社和作者的授权。
版权声明:51Testing软件测试网获清华大学出版社和作者授权连载本书部分章节。任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
三星Gear VR应用开发—VR及AR开发高级教程(8)
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号