Unity使用UGUI进行VR游戏的界面开发
原文链接:http://gad.qq.com/article/detail/7181505
本文首发腾讯GAD开发者平台,未经允许,不得转载
我不知道有多少同学是跟我一样,在开发VR游戏中,是使用的面片或者模型来做的UI界面,响应简单的射线点击或者碰撞事件,来做的一些交互。但是如果想实现一个滚动文本或者滑动条的控件,就显得比较麻烦。
后来有同学跟我讨论过是否可以使用UGUI来做VR游戏界面,当时考虑到UGUI的3D界面也是通过射线响应,感觉是应该是可行的,正在准备开始写的时候,又发现了一个好东西,原来Oculus已经出了一个使用UGUI的Demo,哈哈,我比较懒,就用来学习使用一下。
Unity5.2 Oculus UGUI Demo 链接:https://static.oculus.com/downloads/OVR_UI_Demo_5_2.zip
OculusUnity SDK 链接:https://developer3.oculus.com/downloads/game-engines/0.1.3.0-beta/Oculus_Utilities_for_Unity_5/
看了一下demo,Oculus UGUI是通过用眼睛发出射线,与Canvas交互,上面有一个圆圈模拟鼠标的点,通过头的不停摆动可以移动圆圈,告诉我们鼠标的移动位置,然后通过手柄的A键,模拟鼠标的按下和放开。你就可以看着一个滑动条按住A键就能去拖动(VR的操作都在体验上,每次到这个时候,我都不知道怎样去形容才更好理解,有兴趣的 ,还是自己动手体验一下)。同时,它还通过集成物理射线去响应与3D物体的交互,还集成了鼠标操作。
然后结合自己的项目需求,我们需要处理htc和oculus两种设备的输入,而且决定不用头部来发射射线,而使用手柄来做射线操作,感觉用头部操作,并不是很方便,而且决定去掉鼠标的操作。整理好需求,我们就主要来讨论将Oculus UGUI Demo更改到两种设备都能使用,这里就以更改为htc的操作为例。
1.打开OVR_UI_Demo,这里会报一些错误,那是因为你没有导入Oculus的sdk,但是暂时也不用去管,后面为了方便htc的操作,我们会更改一些操作。首先来看看几个脚本,看着这几个脚本是不是感觉特别熟悉,都是从UGUI扩展来的。

2.先给一个UGUI的源码链接:https://bitbucket.org/Unity-Technologies/ui
,本来想理一下大概的逻辑关系,其实看看也应该都明白了,大概说一下几个脚本的意思,
2.1 OVRGazePointer用来确定射线的终点位置,也就是模拟我们平常的鼠标位置;
2.2 OVRInputModule表示输入模式,简单来说,就是检测按键的按下或者放开,我们会用手柄的按键来模拟鼠标的点击;
2.3 OVRRaycaster表示Canvas的射线检测;
2.4 OVRPhysicsRaycaster物理射线检测,后面用来与一些场景中的3D物体的交互;
2.5 OVRRayPointerEventData的数据还是跟PointerEventData一样,包括一些position、delta、worldSpaceRay等。
3.我们就来开始整理错误,首先创建一个OVRCameraRigInfor脚本,用来存摄像机与射线物体的信息,然后将OVRGazePointer和OVRPhysicsRaycaster脚本里的OVRCameraRig替换为我们所更改的OVRCameraRigInfor,并调用我们里面所设置的变量。

4.更改操作模式,打开OVRInputModule脚本,注释掉Oculus的事件,并设置一个htc的手柄变量,在这里最好导入htc的sdk,因为我们会用到它的一些脚本

然后再GetGazeButtonState添加htc的右手手柄的扳机事件,忽略掉我的HTCVIVE的宏定义,我其实已经做好了两个设置的输入操作,这里我们只看htc的输入操作

然后再在GetExtraScrollDelta添加htc 手柄的Scroll Delta,就是你在拖动滚动条或者滚动文本时所需要的移动Delta

5.到这里好像就行了,我们可以做一个示例来看一看:
5.1 、新建一个场景,删除Main Camera和Directional Light,再拖入SteamVR预设里的[CameraRig];
5.2 在ui中新建一个Canvas,设置Render Mode为World Space,将[CameraRig]的Camera(eye)赋值给event Camera,移除它的Graphic Raycaster组件,并添加OVRRaycaster与OVRCameraRigInfor,并将Camera(eye)、Controller (right)分别给OVRCameraRigInfor

5.3 在EventSystem中移除Standalone Input Module,添加OVRInputModule,并将Controller (right)都赋值给rightTracked与rayTransform

5.4 在Canvas下面创建一个Image命名GazePointer,并绑定OVRGazePointer脚本,将Canvas赋值给Camera Rig,值就是开始说的鼠标点。然后就可以在Canvas下面创建操作界面,点击运行就能通过htc的右手手柄扣动扳机去操作界面。

6.总结:我这里是在写好之后,再发的文章,并没有太多的运行截图,只是讲了一下怎么改为支持htc的一些思路,有兴趣或者不太清楚的同学可以单独找我讨论。因为是oculus的demo,将它改为支持htc就有点不地道,我这里就不放测试工程了。
Unity使用UGUI进行VR游戏的界面开发的更多相关文章
- Unity User Group 北京站图文报道:《Unity3D VR游戏与应用开发》
		
很高兴,能有机会回报Unity技术社区:我和雨松MOMO担任UUG北京站的负责人, 组织Unity技术交流和分享活动. 本次北京UUG活动场地–微软大厦 成功的UUG离不开默默无闻的付出:提前2小时到 ...
 - 我的第一个上线小程序,案例实战篇二——LayaAir游戏开始界面开发
		
不知不觉我的第一个小程序已经上线一周了,uv也稳定的上升着. 很多人说我的小程序没啥用,我默默一笑,心里说:“它一直敦促我学习,敦促我进步”.我的以一个小程序初衷是经验分享,目前先把经验分享到博客园, ...
 - 如何有效提升Unity Gear VR游戏性能
		
http://www.vr186.com/vr_news/vr_technical_area/1093.html 好的,所以你决定用 Unity 来做一个 VR 游戏,并选定了三星 Gear vr 为 ...
 - 在Unity中创建VR游戏
		
添加VR插件为了为您选择的平台创建VR游戏,我们需要下载几个插件.出于本教程的目的,我将向您展示如何上传到Android平台.要上传到iOS,您需要下载 Xcode. 现在让我们下载Unity的Goo ...
 - [Unity] UGUI研究院之游戏摇杆
		
最近在做Unity基于UGUI的摇杆,发现了一种非常简单并且巧妙的方法,原文在这里, 不过要FQ!!http://godstamps.blogspot.tw/2015/07/unity-ugui-sc ...
 - 全景VR视频游戏外包公司:技术分享使用U3D+CB制作VR游戏
		
随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左 ...
 - Unity GUI(uGUI)使用心得与性能总结
		
Unity GUI(uGUI)使用心得与性能总结 作者 kingshijie 关注 2015.09.26 15:35 字数 3686 阅读 28031评论 10喜欢 49 背景和目的 小哈接触Unit ...
 - Unity 3D UGUI Toggle用法教程
		
UGUI Toggle用法教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
 - GOOGLE VR SDK开发VR游戏,VR播放器之中的一个
		
近期一年来,VR虚拟现实和AR增强现实技术的宣传甚嚣尘上.事实上VR,AR技术非常早就有了,一直没有流行开来.不可否认价格是影响技术推广的最大壁垒. 谷歌对VR最大的贡献是提供了便宜的谷歌眼镜,依照G ...
 
随机推荐
- DBSCAN
			
DBSCAN,英文全写为Density-based spatial clustering of applications with noise ,是在 1996 年由Martin Ester, Han ...
 - .Net中Web增加加密狗管理
			
由于业务中最近需要使用到加密狗,增加对Web代码的管控,所以需要进行加密狗使用的研究 首先,对于没有接触使用过加密狗的人需要有个大致的认识,加密狗分为 MasterDog, 1.下载加密狗的开发套件, ...
 - Extensions in UWP Community Toolkit - ListViewExtensions
			
概述 UWP Community Toolkit Extensions 中有一个为 ListView 提供的扩展 - ListViewExtensions,本篇我们结合代码详细讲解 ListView ...
 - [bzoj 1293] [SCOI2009] 生日礼物
			
传送门(bzoj) 传送门(luogu) 题目: Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应 ...
 - [LeetCode] Maximum Distance in Arrays 数组中的最大距离
			
Given m arrays, and each array is sorted in ascending order. Now you can pick up two integers from t ...
 - es6-promise源代码重点难点分析
			
摘要 vue和axios都可以使用es6-promise来实现f1().then(f2).then(f3)这样的连写形式,es6-promise其实现代浏览器已经支持,无需加载外部文件.由于promi ...
 - 教你从手机中提取system镜像制作线刷救砖包的简单方法
			
其实在制作刷机包的过程中,有时候没有官方或者第三方提供的救砖包(线刷),那怎么办?常规的方法有两种:(此处为常规方法,回读的方式暂不说明) 1.卡刷包转线刷包 2.dd命令导出分区镜像 ...
 - [NOI 2010]能量采集
			
Description 题库链接 给你一个 \(n\times m\) 的坐标轴.对于坐标轴的每一个正整数整点 \((x,y)\) 其对答案产生的贡献为 \(2k+1\) ,其中 \(k\) 表示这个 ...
 - Go学习——new()和 make()的区别详解(转载)
			
这篇文章主要介绍了Go语言中new()和 make()的区别详解,本文讲解了new 的主要特性.make 的主要特性,并对它们的区别做了总结,需要的朋友可以参考下 概述 Go 语言中的 new 和 m ...
 - ●BZOJ 2555 SubString
			
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2555题解: 后缀自动机+LCT 不难发现,对于输入的询问串,在自动机里trans后的到的状态 ...