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 中的动作赋值给 pinchActionpinchAction = pinchActionProperty.action;// 将 gripActionProperty 中的动作赋值给 gripActiongripAction = gripActionProperty.action;// 获取当前游戏对象的动画器组件并赋值给 animatoranimator = 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 中定义值的绑定。
具体怎么查看、合适的键、双击文件能看到对应的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按钮的触发值,如果成功则设置动画参数,否则设置为 0if (targetDevice.TryGetFeatureValue(CommonUsages.trigger, out float triggerValue)){handAnimator.SetFloat("Trigger", triggerValue);}else{handAnimator.SetFloat("Trigger", 0);}// 尝试获取grip按键的握取值,如果成功则设置动画参数,否则设置为 0if (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 中处理输入和实现手部动画控制提供了丰富的选择和可能性,开发者可以根据项目的具体需求灵活运用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3246700.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

每日练习,不要放弃

目录 题目1.下面叙述错误的是 ( )2.java如何返回request范围内存在的对象&#xff1f;3.以下代码将打印出4.下列类定义中哪些是合法的抽象类的定义&#xff1f;&#xff08;&#xff09;5.以下代码段执行后的输出结果为6.以下代码运行输出的是总结 题目 选自牛客网 1.下面叙述…

【node-RED 4.0.2】连接操作 Oracle 数据库实现 增 删 改 查【新版,使用新插件:@hylink/node-red-oracle】

总览 上节课&#xff0c;我们说到&#xff0c;在 node-red 上链接 oracle 数据库 我们使用的插件是 node-red-contrib-agur-connector。 其实后来我发现&#xff0c;有一个插件更简便&#xff0c;并且也更好用&#xff1a;hylink/node-red-oracle &#xff01;&#xff01;&am…

Linux--网络基础

计算机网络背景 计算机网络背景是一个复杂而丰富的领域&#xff0c;涵盖了从计算机单机模式到网络互联的演变过程&#xff0c;以及网络技术的不断发展和创新。 计算机单机模式和独立发展 在早期&#xff0c;计算机主要以单机模式存在&#xff0c;即每台计算机都是独立的&…

传知代码-揭秘AI如何揪出图片中的“李鬼”(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 文字篡改图像的“照妖镜”&#xff1a;揭秘AI如何揪出图片中的“李鬼” 在数字化时代&#xff0c;我们时常被各种图像信息所包围。然而&#xff0c;这些图像中有时隐藏着不为人知的秘密——被篡改的文字或图像。这…

C++ | Leetcode C++题解之第238题除自身以外数组的乘积

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int length nums.size();// L 和 R 分别表示左右两侧的乘积列表vector<int> L(length, 0), R(length, 0);vector<int> answer(l…

188数码管轮询扫描

前言 最近用到了188数码管&#xff0c;总结一下。 188数码管&#xff0c;用5个IO&#xff0c;在不借助外部驱动芯片的情况下&#xff0c;可以点亮20个灯。188数码管广泛应用于电子烟、充电器、充电宝、DVD、高级音响、工业设备控制面板、医疗器械等多个领域&#xff0c;满足不…

【iOS】——TaggedPointer

TaggedPointer介绍 在为了改进从 32位CPU 迁移到 64位CPU 的内存浪费和效率问题&#xff0c;在 64位CPU 环境下&#xff0c;引入了 Tagged Pointer 。旨在提高内存效率和运行性能&#xff0c;尤其针对小的、频繁使用的对象&#xff0c;如NSNumber, NSDate, 和NSString等。在64…

昇思学习打卡-19-生成式/Pix2Pix实现图像转换

文章目录 网络介绍训练推理结果 网络介绍 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;可以实现语义/标签到真实图片、灰度图到彩色图、航空图到地图、白天到黑夜、线…

mmdetection

首先下载mmdetection 3.2.0版本的 https://github.com/open-mmlab/mmdetection/tree/v3.2.0 第二步&#xff1a;创建虚拟环境 conda create -n mmdetection python3.8 -y conda activate mmdetection第三步&#xff1a;安装包 pip install torch2.0.1cu118 -f https://downl…

【c++】新领域:“智能数组 ” 问世

引入: 大家有没有发现每次创建和使用数组时很麻烦,因为数组长度一般只能用静态常量,太过局限,不满足大部分开发者的需求。而且遍历数组也很麻烦,又要for循环,又要在其他使用数组的地方检查边界。 于是我就构想了一种“智能数组” 就解决了大部分的难题 这样的语言风格是…

分布式IO系统2通道串口通信模块M602x

现场总线耦合器本身包含一个电源模块&#xff0c;它有 2 个串口通道&#xff0c;通过 Modbus RTU&#xff08;Master&#xff09;协议连接外部串行设备&#xff0c;实现耦合器与外部串行设备通信&#xff0c;现以连接设备的示例带大家了解我们钡铼的2 通道串口通信模块 M602x。…

自闭症孩子为什么容易出现饮食问题?

在星启帆自闭症学校&#xff0c;我们深知自闭症孩子在日常生活中常常面临饮食问题的挑战。这些问题不仅影响孩子的营养摄入和健康成长&#xff0c;也给家庭和学校带来了不小的困扰。以下是我对自闭症孩子容易出现饮食问题的几点分析&#xff1a; 一、感官敏感性 自闭症孩子往往…

【NetTopologySuite类库】合并所有几何的包围盒AABB

流程示意图 示例代码 using GeoAPI.Geometries; using Microsoft.VisualStudio.TestTools.UnitTesting; using NetTopologySuite.Geometries; using NetTopologySuite.IO; using System.Collections.Generic; using System.Linq;namespace Test472 {[TestClass]public class T…

vim网络和安全的操作及shell的使用

目录 vim模式 一般模式下的基本操作&#xff1a; 一般模式切换到编辑模式&#xff1a; 一般模式切换到命令模式&#xff1a; Vim多窗口使用技巧 横向切割打开&#xff1a; 纵向切割打开&#xff1a; 关闭多窗口&#xff1a; 窗口的切换&#xff1a; 网络&#xff1a;…

使用 Flask 3 搭建问答平台(二):User 模型搭建

前言 以下所有代码均是在之前的基础上添加&#xff01;&#xff01;&#xff01; 后面的章节均是如此 知识点 1. 使用 pymysql 模块连接数据库 2. 在模型中创建用户数据表 3. 初始化数据库、创建初始迁移脚本、应用初始迁移脚本 一、User 模型搭建 1.1 准备数据库 1.2 …

Python进阶 异常-包-模块案例

import my_utils.str_util from my_utils import file_utilprint(my_utils.str_util.str_reserves("黑马程序员")) print(my_utils.str_util.substr("itheima",0,4))#文件处理 def print_file_info(file_name):"""将给定路径文件的内容输出…

appium2.0 执行脚本遇到的问题

遇到的问题&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的时候 地址默认加的 /wd/hub 在appium2.0上&#xff0c; 服务器默认路径是 / 如果要用/wd/hub 需要通过启动服务时设置基本路径 appium --base-path/wd/hub 这样就能正常执行了 方法二…

MongoDB综合实战篇(超容易)

一、题目引入 在MongoDB的gk集合里插入以下数据&#xff1a; 用语句完成如下功能&#xff1a; &#xff08;1&#xff09;查询张三同学的成绩信息 &#xff08;2&#xff09;查询李四同学的语文成绩 &#xff08;3&#xff09;查询没有选化学的同学 &#xff08;4&#xf…

Windows与Ubuntu安装ffmpeg

文章目录 前言ffmpeg的简介安装ffmpegWindows下载设置环境变量 Ubuntu 总结 前言 FFmpeg是一款非常强大的开源音视频处理工具&#xff0c;它包含了众多的音视频编解码库&#xff0c;可以用于音视频的采集、编解码、转码、流化、过滤和播放等复杂的处理。在Windows系统上安装FF…

2024年互联网时代:专业企业IM即时通讯聊天软件的重要性不容忽视!

在这个日新月异的信息时代里&#xff0c;企业IM即时通讯无疑是与我们日常生活联系最紧密的科技工具之一&#xff01;它不仅能让我们轻松实现与亲朋好友间的流畅沟通与联系&#xff0c;更为互联网时代的广大企业员工提供了便捷高效的协同办公平台&#xff0c;助力企业内部信息无…