SteamVR简单开发记录过程
一、下载VR环境插件:
1、下载Steam安装包,然后安装Steam
2、下载SteamVR Plugin插件,导入插件:
3、导入后设置:
注意:
这里有时会出现一个很大的问题,如果lnitialize XR on Startup默认是开启状态,那么我们在还没有进入VR场景的时候,程序就已经将VR初始化完了,这时的程序有时就会很卡顿,也不是一定会出现,本人就遇到了,但是又因为在程序运行后,OpenVR Loader的选项已不可动态修改,所以采取了下面的解决方式:
取消勾选 lnitialize XR on Startup
勾选 OpenVR Loader
然后在进入VR和退出VR模式的时候分别代码控制VR的初始化,代码如下:
进入VR:
/// <summary>
/// 进入VR
/// </summary>
/// <returns></returns>
private IEnumerator EnterVR()
{
yield return XRGeneralSettings.Instance.Manager.InitializeLoader();
if (XRGeneralSettings.Instance.Manager.activeLoader == null)
{
Debug.LogError("Initializing XR Failed. Check Editor or Player log for details.");
}
else
{
XRGeneralSettings.Instance.Manager.StartSubsystems();
yield return null;
}
}
退出VR:
public void ExitVR()
{
if (XRGeneralSettings.Instance.Manager.isInitializationComplete)
{
XRGeneralSettings.Instance.Manager.StopSubsystems();
Debug.Log("退出VR");
}
//卸载VR场景
SceneManager.UnloadSceneAsync(2);
}
如果我们没有执行上边的代码,那么我们执行VR场景的时候,还是需要将lnitialize XR on Startup勾选上,不然进入不了VR模拟。
4、下载VIVE Input Utility插件,导入插件:
注意
导入成功以后,就可以观看示例VR的案例功能。
然后贴一个博主介绍的很详细,我也是从这里学到了如何使用,感谢博主。
https://blog.csdn.net/u010645062/article/details/126423571
5、开发使用:
5.1、ViveCameraRig:包含摄像机和左右手柄,有需要修改可以在这里寻找。
5.2、ViveCurvePointers:抛物线,发射抛物线射线
5.3、VivePointers:直线,发射直线射线
用哪个就拖哪个。然后根据需求添加事件,根据需求设置左手和右手的事件或者是防冲突方法,避免混乱。
5.4、可以直接加代码控制各种按钮的事件执行:
private void Update()
{
//菜单按钮按下事件
if (ViveInput.GetPressDown(HandRole.RightHand, ControllerButton.Menu))
{
if (!IsShow)
{
VRPanel.SetActive(true);
IsShow = true;
}
else
{
VRPanel.SetActive(false);
IsShow = false;
}
}
if (ViveInput.GetPressDown(HandRole.LeftHand, ControllerButton.Menu))
{
if (!IsShow)
{
VRPanel.SetActive(true);
IsShow = true;
}
else
{
VRPanel.SetActive(false);
IsShow = false;
}
}
//面板左键抬升
if (ViveInput.GetPressDown(HandRole.RightHand, ControllerButton.DPadLeft))
{
VrCamera.transform.position = new Vector3(VrCamera.transform.position.x, LimitValue(VrCamera.transform.position.y + distance_Y), VrCamera.transform.position.z);
}
if (ViveInput.GetPressDown(HandRole.LeftHand, ControllerButton.DPadLeft))
{
VrCamera.transform.position = new Vector3(VrCamera.transform.position.x, LimitValue(VrCamera.transform.position.y + distance_Y), VrCamera.transform.position.z);
}
//面板右键下降
if (ViveInput.GetPressDown(HandRole.RightHand, ControllerButton.DPadRight))
{
VrCamera.transform.position = new Vector3(VrCamera.transform.position.x, LimitValue(VrCamera.transform.position.y - distance_Y), VrCamera.transform.position.z);
}
if (ViveInput.GetPressDown(HandRole.LeftHand, ControllerButton.DPadRight))
{
VrCamera.transform.position = new Vector3(VrCamera.transform.position.x, LimitValue(VrCamera.transform.position.y - distance_Y), VrCamera.transform.position.z);
}
}
/// <summary>
/// 限制Y轴的值
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private float LimitValue(float value)
{
return Mathf.Clamp(value, minValue, maxValue);
}