VR之暴风魔镜视选功能扩展-倒计时视选

发表于2016-04-05
评论0 3.6k浏览

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有两个摄像头LeftRight,除非你在场景上复制有两个UI,一个给Left,一个给Right,然后WorldToScreenPos计算屏幕坐标……非常麻烦而且效率低下的做法。而且,其实说到底,我们需要显示在最前端的大概也就视点提示和倒计时UI这两个。如果你还有其他的,我认为你最好考虑使用UGUIworld 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脚本,然后添加两个PointEnterPointExit事件,就OK了。剩下的就是响应点击事件的事情了,这很简单,同样是添加一个PointClick事件。注意画布的Event Camera不要空着。

支持3D物体视选

以上我们已经完成了视选UI,然后我们来添加视选3D物体。

首先给MainCamera添加一个Physics Raycaster脚本,然后给场景上添加一个Cube,在Cube上面加上EventTrigger脚本,添加PointEnterPointExitPointClick事件,这就完成了。

我相信这些基础知识难不倒大家。

本次课程就此结束,有任何问题和建议欢迎留言。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引