我对 Unity 和 VR 还很陌生。我必须实现一个传送脚本,而我唯一知道的是我无法移动相机本身,因为对其进行的任何更改都会立即被覆盖。相反,我使用 XR Origin 对象作为运动平台并移动它。该脚本作为组件添加到右手,本质上只是从手上获取 XR Origin 对象和 XR Ray Interactor 组件,当我按下触发器时,它会将 XR Origin 位置移动到射线击中传送区域的位置.
var hit = rayInteractor.TryGetHitInfo(out Vector3 position, out _, out _, out _);
if (hit && triggerPress.action.ReadValue<float>() == 1f)
{
player.transform.position = position;
}
但是,如调试输出所示,实际相机最终并未处于正确的位置:
相机:(0.84, 0.92, -0.94),XR原点:(1.74, 0.00, -2.55),射线命中位置:(1.74, 0.00, -2.55)
我确实理解为什么会发生这种情况。 XR Origin 对象是一个 1 平方米的区域,相机可以位于该区域内的任何点,因此当我更改 XR Origin 对象的位置时,相机可能根本不在对象的中间。我可以通过将 X 和 Z 的 XR 原点比例设置为 0.1 来解决这个问题,这确实会产生非常完美的精度:
相机:(4.02, 0.97, 0.14),XR原点:(4.09, 0.00, 0.00),射线命中位置:(4.09, 0.00, 0.00)
然而,这也破坏了视觉效果。手太小,距离相机超远:
我该如何编写一个传送脚本,在不破坏任何视觉效果的情况下将我传送到确切的位置?难道还有什么我不知道的窍门吗?大多数教程对我来说完全没用,因为我需要在 VS 中进行传送,而不仅仅是在 Unity 本身中
编辑 2:所以有两个想法如何修复它:1)也许相机设置在 XR Origin 对象内的固定位置,我只需要调整相机的起始位置,2)我可以计算之间的差异相机和目的地并将其添加到 XR 原点位置。不过,我要到下周才能测试
我认为,如果您只移动
XROrigin
,您的相机仍然保持与以前相同的相对偏移量。
我的意思是
XROrigin (0,0,0)
和 Camera (1, 0, 0)
开始(因为您已经走到了右边)XROrigin (0, 0, 1)
我希望你的相机实际上最终会在
(1, 0, 1)
处保持偏移。
XROrigin.MoveCameraToWorldLocation(Vector3)
此功能将相机移动到
提供的世界位置。它通过移动desiredWorldLocation
对象来实现此目的,以便相机的世界位置与XR Origin
相匹配desiredWorldLocation
var hit = rayInteractor.TryGetHitInfo(out Vector3 position, out _, out _, out _);
if (hit && triggerPress.action.ReadValue<float>() == 1f)
{
player.GetComponent<XROrigin>().MoveCameraToWorldLocation(position);
}
可能想保持当前的相机高度
var hit = rayInteractor.TryGetHitInfo(out Vector3 position, out _, out _, out _);
if (hit && triggerPress.action.ReadValue<float>() == 1f)
{
var xrOrigin = player.GetComponent<XROrigin>();
position.y = xrOrigin.Camera.transform.position.y;
xrOrigin.MoveCameraToWorldLocation(position);
}
注意:关于
triggerPress.action.ReadValue<float>() == 1f
,由于浮点精度,这可能会失败。您应该首先将您的操作相应地配置为仅在某个阈值时触发,然后使用 triggerPress.action.trigerred