pico+unity3d手部动画

在这里插入图片描述
在 Unity 开发中,输入系统的选择和运用对于实现丰富的交互体验至关重要。本文将深入探讨 Unity 中的 Input System 和 XR Input Subsystem 这两种不同的输入系统,并详细介绍它们在控制手部动画方面的应用。

一、Input System 和 XR Input Subsystem 的区别

Input System 是 Unity 提供的一套功能强大且扩展性高的输入检测系统,适用于键盘、手柄、鼠标、摇杆等多种设备。它将输入设备与动作逻辑分离,通过配置映射来处理输入信息。我们能够在其中定义动作,使一个动作对应多个输入操作,或者将动作与多个设备输入操作进行绑定。
XR Input Subsystem 则是 UnityXR SDK 中的重要部分,主要用于获取按钮、摇杆和设备跟踪信息。它作为用户控制数据输入到 Unity 引擎的核心子系统,会将输入信息传递给 InputDevices 和 InputSystem。

二、使用 Input System 控制手部动画

创建新脚本 Animator Hand Controller


以下是为您注释的上述代码:

```csharp
using System.Collections;  // 引入 System.Collections 命名空间,提供了一些通用的集合类型
using System.Collections.Generic;  // 引入 System.Collections.Generic 命名空间,提供了一些泛型集合类型
using UnityEngine;  // 引入 Unity 引擎的基本功能和类
using UnityEngine.InputSystem;  // 引入 Unity 的输入系统相关的类和功能

/**
 * AnimateHandController 类,用于控制手部动画
 */
public class AnimateHandController : MonoBehaviour
{
    // 公开的输入动作属性 - 捏合动作
    public InputActionProperty pinchActionProperty;
    // 公开的输入动作属性 - 握取动作
    public InputActionProperty gripActionProperty;
    // 私有变量,存储捏合动作
    private InputAction pinchAction;
    // 私有变量,存储握取动作
    private InputAction gripAction;
    // 私有变量,存储动画器
    private Animator animator;

    // Start 方法,在游戏对象实例化后的第一帧更新之前调用,用于初始化
    void Start()
    {
    	 //设置后在物体上添加脚本,进行绑定pico的值
        // 将 pinchActionProperty 中的动作赋值给 pinchAction
        pinchAction = pinchActionProperty.action;
        // 将 gripActionProperty 中的动作赋值给 gripAction
        gripAction = gripActionProperty.action;
        // 获取当前游戏对象的动画器组件并赋值给 animator
        animator = GetComponent<Animator>();
    }

    // Update 方法,每一帧都会被调用,用于实时更新逻辑
    void Update()
    {
        // 读取捏合动作的值并转换为 float 类型
        float triggerValue = pinchAction.ReadValue<float>();
        // 设置动画器的 "Trigger" 参数为读取到的捏合值
        animator.SetFloat("Trigger", triggerValue);

        // 读取握取动作的值并转换为 float 类型
        float gripValue = gripAction.ReadValue<float>();
        // 设置动画器的 "Grip" 参数为读取到的握取值
        animator.SetFloat("Grip", gripValue);
    }
}

然后倒入pico中已经定义的值,左右手柄都要绑定
在这里插入图片描述
在这个脚本中,我们首先定义了输入动作属性,然后在 Start 方法中获取对应的输入动作,并获取动画器组件。在 Update 方法中,读取输入动作的值并设置动画器的相应参数,从而实现手部动画的控制。
要使用这个脚本,需要在物体上添加脚本,并进行 Pico 中定义值的绑定。

2、 unityXR


using System.Collections;  // 引入 System.Collections 命名空间,用于处理非泛型集合
using System.Collections.Generic;  // 引入 System.Collections.Generic 命名空间,用于处理泛型集合
using UnityEngine;  // 引入 UnityEngine 命名空间,用于访问 Unity 引擎的基本功能和组件
using UnityEngine.XR;  // 引入 UnityEngine.XR 命名空间,用于处理虚拟现实和增强现实相关的功能

/**
 * HandPresence 类,用于处理手部存在和动画相关的操作
 */
public class HandPresence : MonoBehaviour
{
    // 输入设备的类型:头部设备、控制器等;可以多选,手部动作的话,选择左右和控制器
    public InputDeviceCharacteristics controllerCharacteristics;  

    // 目标输入设备
    private InputDevice targetDevice;  

    // 手部动画器
    private Animator handAnimator;  

    // 在游戏开始时执行的初始化方法
    private void Start()
    {
        // 获取当前游戏对象的动画器组件
        handAnimator = GetComponent<Animator>();  
        // 尝试初始化输入设备
        TryInitialize();  
    }

    // 尝试初始化输入设备的方法
    private void TryInitialize()
    {
        // 创建一个新的输入设备列表
        List<InputDevice> devices = new List<InputDevice>();  

        // 根据指定的特征获取输入设备,并将其添加到列表中
        InputDevices.GetDevicesWithCharacteristics(controllerCharacteristics, devices);  
        // 如果找到的设备数量大于 0,则将第一个设备设置为目标设备
        if (devices.Count > 0)
        {
            targetDevice = devices[0];
        }
    }

    // 实时更新手部动画的方法
    private void UpdateHandAnimation()
    {
        // 尝试获取trigger按钮的触发值,如果成功则设置动画参数,否则设置为 0
        if (targetDevice.TryGetFeatureValue(CommonUsages.trigger, out float triggerValue))
        {
            handAnimator.SetFloat("Trigger", triggerValue);
        }
        else
        {
            handAnimator.SetFloat("Trigger", 0);
        }

        // 尝试获取grip按键的握取值,如果成功则设置动画参数,否则设置为 0
        if (targetDevice.TryGetFeatureValue(CommonUsages.grip, out float gripValue))
        {
            handAnimator.SetFloat("Grip", gripValue);
        }
        else
        {
            handAnimator.SetFloat("Grip", 0);
        }
    }

    // 实时每帧更新的方法
    private void Update()
    {
        // 如果目标设备无效,则重新尝试初始化
        if(!targetDevice.isValid)
        {
            TryInitialize();
        }
        else
        {
            // 否则更新手部动画
            UpdateHandAnimation();
        }
    }
}
}

选择输入设备输入设备的类型:头部设备、控制器等;可以多选,手部动作的话,选择左右和控制器
在这里插入图片描述

在这个脚本中,我们首先定义了输入设备的特征,然后在 Start 方法中获取动画器组件并尝试初始化输入设备。通过不断检测设备的有效性,并根据获取到的输入值更新手部动画的参数。
对于不同厂商设备按键与动作输入的映射,您可以参考 Unity 官方文档的不同厂商设备按键与动作输入的映射表
综上所述,Input System 和 XR Input Subsystem 为我们在 Unity 中处理输入和实现手部动画控制提供了丰富的选择和可能性,开发者可以根据项目的具体需求灵活运用。

相关推荐

  1. YOLO目标检测

    2024-07-16 21:50:05       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 21:50:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 21:50:05       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 21:50:05       58 阅读
  4. Python语言-面向对象

    2024-07-16 21:50:05       69 阅读

热门阅读

  1. 年轻人如何克服焦虑

    2024-07-16 21:50:05       18 阅读
  2. 设计模式10-抽象工厂

    2024-07-16 21:50:05       17 阅读
  3. C++中的常量详解

    2024-07-16 21:50:05       17 阅读
  4. 举例说明自然语言处理(NLP)技术

    2024-07-16 21:50:05       15 阅读
  5. npm install 打包时间优化

    2024-07-16 21:50:05       21 阅读
  6. 安全与认证:在Symfony中实现用户登录和权限管理

    2024-07-16 21:50:05       17 阅读