正如标题所说,我正在尝试在不同应用程序之间启用/禁用 VR,并且我需要尽可能多地执行此操作。我正在使用 Unity 2017.4 和 SteamVR 2.0.1。我正在尝试使用同一个项目的两个不同场景(在编辑器中测试一个,并以 .exe 启动另一个)。
这个解决方案不起作用,因为当 VR 停止时,XRSettings.enabled = false 显然没有正确处理动作和姿势。
有没有人经历过同样的行为?
我试图找到一种解决方法:
1)禁用/启用玩家和手
...
// ** ENABLE VR **
if (enable)
{
print("Enabling VR ...");
XRSettings.LoadDeviceByName("OpenVR");
yield return null;
print("Loaded device: " + XRSettings.loadedDeviceName);
XRSettings.enabled = enable;
EnablePlayerAndHands(true);
}
// ** DISABLE VR **
else
{
print("Disabling VR ...");
EnablePlayerAndHands(false);
XRSettings.LoadDeviceByName("");
yield return null;
print("Loaded device: " + XRSettings.loadedDeviceName);
XRSettings.enabled = false;
}
...
2)在 SteamVR.cs 文件中添加这些行:
private void Dispose(bool disposing)
{
...
// added code
SteamVR_Input.initialized = false;
SteamVR_Behaviour.instance = null;
}
(为了使它工作,我必须为 SteamVR_Behaviour.instance 属性添加一个公共设置器)。
3)在 SteamVR_Behaviour 中,我在 Update()、LateUpdate() 和 FixedUpdate() 中添加了一个检查:
if (_instance != null) ... // do update
这些修改实际上并不能解决问题,因为我在启用回 VR 时仍然有一些异常,例如:
GetPoseActionData error (/actions/default/in/SkeletonLeftHand): InvalidHandle handle: 1152990670760182193
UnityEngine.Debug:LogError(Object)
Valve.VR.SteamVR_Action_Pose:UpdateValue(SteamVR_Input_Sources, Boolean) (at Assets/SteamVR/Input/SteamVR_Action_Pose.cs:96)
Valve.VR.SteamVR_Action_Skeleton:UpdateValue(SteamVR_Input_Sources, Boolean) (at Assets/SteamVR/Input/SteamVR_Action_Skeleton.cs:75)
Valve.VR.SteamVR_Input:UpdateSkeletonActions(SteamVR_Input_Sources, Boolean) (at Assets/SteamVR/Input/SteamVR_Input.cs:487)
Valve.VR.SteamVR_Input:UpdateSkeletonActions(Boolean) (at Assets/SteamVR/Input/SteamVR_Input.cs:462)
Valve.VR.SteamVR_Input:LateUpdate() (at Assets/SteamVR/Input/SteamVR_Input.cs:352)
Valve.VR.SteamVR_Behaviour:LateUpdate() (at Assets/SteamVR/Scripts/SteamVR_Behaviour.cs:224)
...但它们只被提升了几次,然后它们就停止了。这可能是由于一些糟糕的时机。顺便说一句,我在空场景中放置了一个可交互的游戏对象,只是为了测试在禁用/启用后我是否仍然可以与它交互,看来我可以。
不过,我希望有一些更简单、更清洁的方法来实现我的目标。我错过了什么明显的东西还是 SteamVR 最新版本的错误?
提前感谢您的帮助。