如何使用 Unity Oculus VR 锁定抓取对象的旋转

问题描述 投票:0回答:2

对于我正在开发的 Oculus Quest 游戏,我需要能够抓住一个物体而不以任何方式旋转它。我应该能够在 x、y 和 z 轴上移动它。我在攀爬游戏中这样做,并且该物体相当大。我的玩家被锁定在 (0,0,0),你可以通过抓住地形并移动它来攀登,给人一种你正在攀登的错觉。

我正在使用 Unity 的 Oculus 集成资产,并且我在想要抓取的对象上有 OVR Grabbable 脚本。

如何确保我抓取的物体根本不旋转?

我尝试过使用刚体并锁定我想像那样攀爬的墙壁的旋转,但这不起作用。一旦我抓住它,我仍然可以旋转该物体。

我也尝试过锁定手刚体的旋转,但该设置似乎被忽略,因为我仍然可以旋转手。

我还尝试在脚本中添加一些代码,这将重置固定更新中的对象旋转。我将此代码放入 OVR Grabbable 脚本中。

void FixedUpdate()
{
    transform.rotation = Quaternion.identity;
}

使用此代码并不能阻止墙旋转,但它确实每帧都会恢复到旋转 (0,0,0)。这导致墙的功能就好像它仍然会旋转一样,但看起来它在 (0,0,0) 和每帧中的旋转之间切换。这当然也不是我们想要的结果。

我没有使用 VRTK,因为这不适用于我想要实现的攀岩类型。

我希望能够抓取一个物体,在 x、y 和 z 轴上移动它,同时它根本不旋转。目前,我仍然可以旋转该对象。我该如何解决这个问题并在抓取物体时完全锁定旋转?

c# visual-studio unity-game-engine virtual-reality
2个回答
3
投票

如果对象已成为手的子对象,并且您仍然希望它移动但不旋转。您可以添加一个简单的脚本,对其默认旋转进行评分并将其应用到 LateUpdate 中。

这是为非物理对象设计的,因此请务必删除将刚体添加到墙上的测试。

像这样简单的事情就可以完成工作。

Quaternion defaultRotation;

void Awake()
{
    defaultRotation = transform.rotation;
}

void LateUpdate()
{
    transform.rotation = defaultRotation;
}

0
投票

如果您想使用包的脚本找到解决方案:

  1. 向游戏对象添加一个脚本组件,其中包含名为OneGrabFreeTransformer的Grabbable脚本(我只用一只手来抓取,如果你用双手使用TwoGrabFreeTransformer。)然后选中Constrain的3框每个轴:

  2. One Grab Free Transformer Script 组件抓取到可抓取组件 > 可选 > One Grab Free Transformer 中:

就是这样!

注意:我使用的是 All-In-One SDK 62.0.0,它将多个 Meta SDK 捆绑在一起,就像 Oculus Integration 在之前版本上所做的交互 SDK 一样。如果您使用旧版本的 Oculus Integration,您可能找不到我谈到的组件,或者您可能会找到不同的名称。我建议您迁移到最新版本的 Oculus Integration,最好迁移到 All-In-One SDK。

© www.soinside.com 2019 - 2024. All rights reserved.