VR之暴风魔镜视选功能扩展-倒计时视选
VR之暴风魔镜视选功能扩展-倒计时视选
一、导入MojingSDK
1、到官网http://open.mojing.cn/sdk/download?nid=16&pt=3下载最新Unity SDK包,新建工程,导入工程。运行Demo中的第一个实例,如下图所示:
2、将所有场景添加到Build Setting中。
Alt+鼠标模拟头部转动,中心视点集中到“返回”,点击鼠标左键可以返回菜单。
其他功能不一一赘述,大家自行体会。
二、添加Edit视选UI
我们注意到在Edit模式下,看不到中心的视点提示,而在手机中运行Demo是可以看到的,我们新建一个脚本,将SetOverlay脚本全部复制过来,再在OnGUI中添加几行自定义的代码,使之在Edit模式下也能显示视点提示。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #if UNITY_EDITOR if (Mojing.SDK.VRModeEnabled) { m_LScreenPos = LCamera.WorldToScreenPoint (CenterPointer.transform.position); m_RScreenPos = RCamera.WorldToScreenPoint (CenterPointer.transform.position); GUI.DrawTexture( new Rect(m_LScreenPos.x - m_halfTexW, m_LScreenPos.y - m_halfTexH, m_halfTexW*2, m_halfTexH*2), curTex); GUI.DrawTexture( new Rect(m_RScreenPos.x - m_halfTexW, m_RScreenPos.y - m_halfTexH, m_halfTexW*2, m_halfTexH*2), curTex); } else { GUI.DrawTexture( new Rect(0.5f * Screen.width - m_halfTexW, 0.5f * Screen.height - m_halfTexH, m_halfTexW*2, m_halfTexH*2), curTex); } #endif |
这里只给出部分代码,具体细节请自行查看后面上传的完整代码。
三、添加倒计时视选功能
我们注意到,在魔镜APP中视选有个倒计时的功能,就是视点聚焦到Button后,会有个圈圈开始转,如果你不移动视点,等待视圈转完,它就默认你进行了一次点击,然后响应点击事件。我们也来实现这种功能。
首先视点提示是通过MojingSDK.Unity_SetOverlay3D函数来绘制上去的。这个是Mojing自定义的一个绘制接口,我们也使用它来完成这个功能,选择它的原因有两个:一个是你无法在OnGUI里面绘制任何东西(这里指在手机平台上运行的时候),因为OnGUI里面的函数被屏蔽了。而使用UGUI里的ScreenSpace模式绘制的话,显然也不合适,VR有两个摄像头Left和Right,除非你在场景上复制有两个UI,一个给Left,一个给Right,然后WorldToScreenPos计算屏幕坐标……非常麻烦而且效率低下的做法。而且,其实说到底,我们需要显示在最前端的大概也就视点提示和倒计时UI这两个。如果你还有其他的,我认为你最好考虑使用UGUI的world space模式。
回到正题,我们写一个很简单的帧动画脚本,来实现倒计时UI,当然我这里给出的脚本效率不高还比较麻烦,如果你有心,可以改进它。
下面是截图:
那一长串的就是序列帧了,然后另外一个需要注意的是它有一个动画结束事件,用来提示你时间到了。
这个完成了以后,我们还需要确定倒计时开始和结束的判断条件。我们可以这样定义需求:当视点移动到Button上面时,这时PointEnter事件触发了,我们认为倒计时开始了,然后开始播放倒计时动画,如果视点中途退出了Button(PointExit事件被触发),我们认为倒计时被终止。
一下是部分代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public void OnPointerEnter(BaseEventData eventData) { //Debug.Log ("OnPointerEnter"); m_waitTime = Time.time; m_isOver = true ; curTex = texOver; curTexID = texOverID; m_eventData = eventData; MojingInputManager.Instance.OnTouchEvent( "ACTION_DOWN" ); } public void OnPointerExit(BaseEventData eventData) { //Debug.Log ("OnPointerExit"); m_isOver = false ; UIViewSelAnimCtr.StopAnimation(); curTex = texNormal; curTexID = texNormalID; m_eventData = null ; } |
所以,我们只需要给Button按钮加个EventTrigger脚本,然后添加两个PointEnter和PointExit事件,就OK了。剩下的就是响应点击事件的事情了,这很简单,同样是添加一个PointClick事件。注意画布的Event Camera不要空着。
四、支持3D物体视选
以上我们已经完成了视选UI,然后我们来添加视选3D物体。
首先给MainCamera添加一个Physics Raycaster脚本,然后给场景上添加一个Cube,在Cube上面加上EventTrigger脚本,添加PointEnter和PointExit、PointClick事件,这就完成了。
我相信这些基础知识难不倒大家。
本次课程就此结束,有任何问题和建议欢迎留言。