如何在Unity VR动画抓取?



我已经在谷歌上搜索了10个小时了,我已经没有主意了。我找到了一些视频教程和书面教程,但没有一个真正有效,或者它们是多余的。

我有VR Unity (2020.3.16f)项目,旨在在任务2上运行。我没有使用OpenXR。我已经创建了hand,创建了一个简单的抓取动画,将动画添加到Animator,创建了过渡,并设置了IsGrabbed"参数。现在我正在寻找一个简单的方法改变&;isgrabbed &;当我抓取/释放任何东西时,true/false。我期待这样的内容:

public class grabber : MonoBehaviour
{
// Start is called before the first frame update
Animator animator;
???
void Start()
{
???
}
// Update is called once per frame
void Update()
{
if (???)
{
animator.SetBool("IsGrabbing", true);
}
elseif (???)
{
animator.SetBool("IsGrabbing", false);
}
}
}

请帮助。我们在这里谈论的是虚拟现实,所以我确信抓取动画是非常基础的,非常基础的。这不会很难的。

问好

首先,我强烈建议您观看Justin p Barnett的视频,以更好地了解这一切是如何工作的。

如果你出于某种原因不想走那条路,还有其他选择可供你选择。其中一个选项是"播放器输入"。组件,它可以作为输入设备和代码之间的桥梁。现在大多数XR包都使用新的输入系统包,它使工作更容易,所以我假设您已经安装了它。

首先,您需要创建一个Input Actions资产,这可以在项目窗格中完成:右键单击->创建→输入操作。有很多教程详细解释了这个资产,但这里有一个简单的设置让你开始。双击新资源打开编辑窗口,创建一个新的Action Map。在"行动"中列表中,创建一个动作类型为Value、Control type Axis的新动作,并在新动作上的下拉箭头中设置到输入源的路径。作为示例源路径,我将使用XR控制器->XR控制器->XR控制器(左手)->可选控件->控制。请确保在关闭窗口之前单击Save Asset。

创建如下脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class ControllerInputReceiver : MonoBehaviour {
public void FloatToScale(InputAction.CallbackContext context) {
float val = 0.1f + 0.1f * context.ReadValue<float>();
transform.localScale = new Vector3(val, val, val);
}
}

在场景中可见的某个地方创建一个多维数据集,并将Input Action Manager组件添加到其中,并将创建的Input Actions资产拖动到它的Action Assets列表中。然后添加ControllerInputReceiver脚本。同样在这个多维数据集上,创建一个Player Input组件,并将你的Input Actions资产拖到它的Actions元素上。选择您的地图作为默认地图,并将行为更改为Invoke Unity Events。在events下拉列表中,您应该看到前面创建的Action的一个元素。把你的Controller Input Receiver组件放到这个Action中,然后选择FloatToScale函数。

理论上它应该在这一点上工作。在你的设备上构建游戏,看看拉动手柄是否会改变立方体的大小。如果是,那么您可以将Update函数替换为:

void SetGrabbing(InputAction.CallbackContext context) {
animator.SetBool("IsGrabbing", context.ReadValue<float>() > cutoff);
}

如果你在这一点上仍然有问题,我真的建议看看这些youtube频道。我几个月前才开始接触虚拟现实,从这些人那里学到了我所知道的一切。JustinPBarnett, VRwithAndrew, ValemVR, LevelUp2020。(链接被删除了,因为它一直把我的文章搞砸)

注意,新的输入系统有按钮选项,而不是VR设备的值/轴选项。这些可能更接近你想要的,但我今天没能让它们工作。

还要注意,根据你组织代码的方式,你可能需要也可能不需要"输入操作管理器"。组件在场景的某个地方,在它的列表中有你的输入动作资源。它为您启用您的操作,而不需要您以编程方式执行此操作。

另一个解决方案是:

使用OVR插件和Hands预制(用于左和右),检查每个手指在特定轴(例如z轴)上的旋转是否落在特定范围内-这意味着手指正在抓取/弯曲。

通过引用例如b_l_index1的Transform,它是模型中食指的对应部分,你可以每帧检查它的局部旋转,当所有的手指旋转到一个特定的角度时触发抓取事件。然后,触发你需要的动画。

最新更新