Unity.VR.05之3D凝视进度条的实现

来源:互联网 发布:nosql和sql有什么不同 编辑:程序博客网 时间:2024/04/29 11:06
【学习项目为Unity官方的VR Smaples,可以在Asset Store下载】
【参考官方学习教程Unity.learn.Virtual Reality】

VR Smaples中的凝视环可以加强玩家的交互体验并防止玩家的误操作,通过UGUI中的Image和Slider的组件就可以轻松实现。但在VR游戏之中,我们有时候会需要一些3D网格对象制作的滑动进度条,这个时候应该怎么做呢?VR Smaples中的SelectionSlider脚本给出了答案。

private void HandleDown ()  {  if (m_GazeOver)  m_FillBarRoutine = StartCoroutine(FillBar());  }  private void HandleUp ()  {  if(m_FillBarRoutine != null)  StopCoroutine (m_FillBarRoutine);  m_Timer = 0f;  SetSliderValue(0f);  }
HandleDown()方法:按下键,如果凝视该对象的话,则开启协程FillBar();
HandleUp()方法:放开键,如果协程FillBar()还在执行,则终止该协程,将填充进度记时和滑动条填充值清零;
相应的HandleOver()及HandleOut()则根据凝视与否做出了播放声音和停止填充的动作。
private void OnEnable ()  {  m_VRInput.OnDown += HandleDown;  m_VRInput.OnUp += HandleUp;  m_InteractiveItem.OnOver += HandleOver;  m_InteractiveItem.OnOut += HandleOut;  }
通过输入的脚本VRInput来订阅按下键和放开键的相关方法;
通过交互对象关联的脚本InteractiveItem来订阅凝视和停止凝视的相关方法。
private IEnumerator FillBar ()  {  m_Timer = 0f;  float fillTime = m_SelectionRadial != null ? m_SelectionRadial.SelectionDuration : m_Duration;  while (m_Timer < fillTime)  {  m_Timer += Time.deltaTime;  SetSliderValue(m_Timer / fillTime);  yield return null;  if (m_GazeOver)  continue;  m_Timer = 0f;  SetSliderValue (0f);  yield break;  }  m_BarFilled = true;  if (OnBarFilled != null)  OnBarFilled ();  m_Audio.clip = m_OnFilledClip;  m_Audio.Play();  if (m_DisableOnBarFill)  enabled = false;  }
上面则是填充进度条的FillBar协程,通过一个限定时间的while循环,在2秒内执行进度条填充的动作;
m_Timer/fillTime 记录的是进度条的填充进度,当值为1时,跳出while循环,且进度条填充完成。
进度条填充的具体动作则是由SetSliderValue()方法来显示的。
  private void SetSliderValue (float sliderValue)  {  // If there is a slider component set it's value to the given slider value.  if (m_Slider)  m_Slider.value = sliderValue;  // If there is a renderer set the shader's property to the given slider value.  if(m_Renderer)  m_Renderer.sharedMaterial.SetFloat (k_SliderMaterialPropertyName, sliderValue);  }
m_Slieder如果引用了UI对象的Slider组件的话,则可以通过Slider中的value控件直接赋值,完成进度条的填充;
private const string k_SliderMaterialPropertyName = "_SliderValue";
col = lerp(colfill, col, step(_SliderValue, i.uv.x)); //所用材质中的Shader
m_Renderer如果引用了网格对象的Mesh Renderer组件的话,则通过Mesh Renderer的材质控件的SetFloat方法,找到使用材质的Shader脚本中的变量_SliderValue进行赋值,这样就完成了一个网格对象的凝视进度条。
0 0
原创粉丝点击