首页 > 解决方案 > 如何在 Unity VR 中为抓取设置动画?

问题描述

我已经在谷歌上搜索了 10 个小时,但我的想法已经不多了。我找到了几个视频教程和书面教程,但它们都不是真正有效的,或者它们是矫枉过正的。

我有设计为在 Quest 2 上运行的 VR Unity (2020.3.16f) 项目。我没有使用 OpenXR。我已经创建了手,创建了一个简单的抓取动画,将动画添加到 Animator,创建了过渡,并设置了“IsGrabbed”参数。现在我正在寻找一种简单的方法来将“IsGrabbed”更改为真/假,每当我抓住/释放任何东西时。我期待这样的事情:

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);
           }
    }
}

请帮忙。我们在这里谈论的是 VR,所以我敢肯定,抓取动画是非常基础的非常基础的基础。不可能有任何困难。

此致

标签: unity3dvirtual-realityquest

解决方案


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

如果您出于某种原因不想走这条路,还有其他选择可供您使用。一个这样的选项是“播放器输入”组件,它可以充当输入设备和代码之间的桥梁。现在大多数 XR 包都使用新的 Input System 包,它让生活更轻松,所以我假设你已经安装了它。

首先,您需要创建一个 Input Actions 资产,这可以在项目窗格中完成:右键单击 -> Create -> Input Actions。有许多教程详细解释了此资产,但这里有一个简单的设置来帮助您入门。双击新资产打开编辑窗口,并创建一个新的动作地图。在“动作”列表中,使用动作类型值、控件类型轴创建一个新动作,并在新动作的下拉箭头中设置输入源的路径。作为示例源路径,我将使用 XR Controller -> XR Controller -> XR Controller (Left Hand) -> Optional Controls -> Grip。确保在关闭窗口之前单击保存资产。

创建一个类似这样的脚本:

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 元素上。选择您的地图作为默认地图并将行为更改为调用 Unity 事件。在事件下拉列表下,您应该会看到您之前创建的操作的元素。将您的 Controller Input Receiver 组件放入此 Action 并选择 FloatToScale 函数。

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

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

如果您此时仍有问题,我真的建议您查看这些 youtube 频道。几个月前我才开始使用 VR,并且从这些人那里学到了迄今为​​止我所知道的一切。JustinPBarnett,VRwithAndrew,ValemVR,LevelUp2020。(链接被删除,因为它一直在搞砸我的帖子)

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

另请注意,根据您组织代码的方式,您可能需要也可能不需要场景中某处的“输入操作管理器”组件,其中您的输入操作资产位于其列表中。它可以为您执行操作,而无需您以编程方式执行此操作。


推荐阅读