【Unity动画系统】详解Root Motion动画在Unity中的应用(二)

2024-04-29 14:12

本文主要是介绍【Unity动画系统】详解Root Motion动画在Unity中的应用(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Root Motion遇到Blend Tree 

如果Root Motion动画片段的速度是1.8,那么阈值就要设置为1.8,那么在代码中的参数就可以直接反映出Root Motion的最终移动速度。

Compute Thresholds:根据Root Motion中某些数值自动计算这里的阈值。

Velocity X/Y/Z:代表在XYZ方向上的速度,注意Z方向的话,也就是前后的方向上的位移速度。

Root Motion下的旋转速度,第一个是弧度每秒,第二个是角度每秒;一般用在角色转身的时候。

有时候多个动画的播放速度不一致,那么可以选择Adjust Time Scale的第一个Homogeneous Speed,Unity会自动为我们计算出这里的播放速度。

但是游戏角色并不是上面Threshold里同样的速度移动,Threshold中的速度是针对行走动画原本的骨骼的,而Unity中是通过Avatar系统复用了这个动画,所以移动速度会有改变。

不同角色应用相同的Root Motion,移动速度为什么不一样?

虽然transform相同,但是人物缩放值不一样(Avatar不一样)

void Start(){aniamtor.humanScale;	//获取角色骨骼的大小animator.speed /= animator.humanScale;	//速度/人物大小就可以求得相同的速度
}

但是又不想影响动画速度,那么就使用。

void Start()
animator.SetFloat("ScaleFoctor" , 1 / animator.ScaleFoctor);	

这样只有BlendTree播放的速度会受到影响(BlendTree的播放速度,相对应的其他动画正常速度播放,简而知加速后减速,动画加速但是混合树减速),虽然前进步数加快导致速度加快,但是混合树使整个动画播放变慢,则导致动画播放正常。

如何在使用Root Motion时自定义移动速度

使用Root Motion会使移动速度变慢,如果我们想自定义移动速度,那么最简单粗暴就是改变动画速度。

如果想改变速度就用“想改变的速度/阈值”,然后改成播放速度。

但其实移动的速度不是匀速的。

上面的阈值其实是移动的平均值。

为什么引入Root Motion,怕导致动画与移动不同步。

总结:

Root Motion最主要是解决动画,而不是位移,那么我们应该把移动的控制权从Root Motion中拿回来(RigidBody主要用来模拟各种物理计算)。接下来引入RigidBody:

Rigidbody rig;void Start(){rig = GetComponent<Rigidbody>();
}private void OnAnimatorMove(){	//启用后Unity不再用直接用Root Motion来驱动游戏对象,调用时间在FixedUpdate和动画系统的各回调方法之后,物理引擎计算之前Move();
}void Move(){currentSpeed = Mathf.Lerp(targetSpeed, currentSpeed, 0.5f);animator.SetFloat("Speed", currentSpeed);rig.velocity = animator.velocity;	//rig.velocity = currentSpeed;	//如果希望精准运动的话,就将currentSpeed赋值给rig,不过这里动画和移动可能会有细微不同步
}

需要将Update Mode改为Animate Physics。

Root Motion与RigidBody的冲突:重力为什么不起作用了?

为什么使用RigidBody,重力不起作用了?

要将Root Transform Position(Y)的Bake Into Pose打开

使用RigidBody后角色下落速度慢是为什么?

在物理引擎Internal physics update给物理引擎一个9.8的下落速度,然后FixedUpdate是一秒刷新50次,就是0.02s一次。

Rigidbody大概在Internal physics update里获取一个大约0.196的向下速度,然后rigidbody也会根据当前的速度对游戏对象进行位移,然后物理引擎刷新回到OnAnimatorMove,但是此时将速度刷新归0,又重新获取速度0.196被强行打断了下落速度。

解决:x与z的速度来自于动画的xz,但y轴的来自rigidbody。

Vector3 vector3 = new Vector3(animator.velocity.x , rig.velocity.y , animator.velocity.z);
rig.velocity = vector3;

考虑:

如果对重力要求不高,那么可以自己写脚本来控制重力。

如果对移动要求不高,那么可以不使用Root Motion。

重点:Root Transform Position(Y)的Bake Into Pose最好勾上,然后动画的Update Mode改为Animate Physics,而且使用RigidBody后不要将代码执行放在FixedUpdate或者OnAnimatorMove方法里(刷新方式为Animate Physics)。

在Unity中利用Root Motion、Input System、Cinemachine制作一个简单的角色控制器

创建一个人物控制器,然后创建一个混合树改名为Locomotion。

创建一个参数Vertical Speed,让动作转换来自此参数。

添加三个动作,不设置自动阈值。

以Z轴方向为主进行阈值设定,用想要的速度/现阈值求出播放速度。

添加一个Player Input,设置输入系统:

Behaviour改为用Unity的事件

添加方法

添加刚体和碰撞体

从Cinemachine添加一个Virtual Camera

因为做的是一个俯视的视角,所以不需要旋转,死死的跟住角色即可。

添加一个脚本TopDown来做控制器:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Rendering;public class TopDown : MonoBehaviour
{Animator animator;  //动画Vector2 playerInputVec; //保存用户的输入bool isRunning; //判断是否在跑Vector3 playerMovement; //玩家的运动public float rotateSpeed = 1000;Transform playerTransform;float currentSpeed; //当前的速度float targetSpeed;  //目标速度float walkSpeed = 1.5f;    //走路速度float RunSpeed = 3.5f;  //奔跑的速度private void Start(){animator= GetComponent<Animator>();playerTransform = transform;    //缓存只需要找一遍,而调用transform则每次都要找一遍}private void Update(){RotatePlayer();MovePlayer();}public void GetPlayerMoveInput(InputAction.CallbackContext ctx)    //接收玩家输入的方法{playerInputVec = ctx.ReadValue<Vector2>();  //接收玩家放向键入Debug.Log(playerInputVec);}public void GetPlayerRunInput(InputAction.CallbackContext ctx)  //奔跑方面的操作{isRunning = ctx.ReadValue<float>() > 0 ? true : false;  //从输入系统中读取float的值 Debug.Log(isRunning);}void RotatePlayer() //旋转角色的方法{if (playerInputVec.Equals(Vector2.zero))    //判断玩家的输入是不是0,是0则return{return;}playerMovement.x = playerInputVec.x;playerMovement.z = playerInputVec.y;Quaternion targetRotation = Quaternion.LookRotation(playerMovement , Vector3.up);   //playermovement是z轴的朝向的,playermovement与up叉乘的结果是x轴朝向的向量,x轴与z轴叉乘的结果是y轴方向。  transform.rotation = Quaternion.RotateTowards(playerTransform.rotation , targetRotation , rotateSpeed * Time.deltaTime);    //向什么方向转,每帧旋转多少}void MovePlayer(){targetSpeed = isRunning ? RunSpeed : walkSpeed;targetSpeed *= playerInputVec.magnitude;    //判断是否有输入,即使在奔跑输入为0那么就不移动currentSpeed = Mathf.Lerp(currentSpeed, targetSpeed, 0.5f); //0.5的速度逐渐增加到目标速度animator.SetFloat("Vertical Speed", currentSpeed);}
}

这篇关于【Unity动画系统】详解Root Motion动画在Unity中的应用(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946315

相关文章

智慧营收 | 水务营收系统 | 自来水收费缴费系统

一套集客户管理、表具管理(机械表、IC卡表、远传表)、财务管理、抄表结算、收费管理、发票管理、报表分析、表务管理、报装业务等功能为一体的综合性供水管理信息化系统。 智慧营收 “ 一张图 ” 利用大数据、可视化、人工智能等信息化技术,通过对水务客服业务数据统计、融合及挖掘分析,综合展示集团供水营业管理信息,主要包括营销收费一张图,抄表一张图,业务一张图,表务一张图等主题数据可视化分析展示。 1.

微信公众号自定义分销商城小程序源码系统 带完整的安装代码吧以及系统部署搭建教程

系统概述 微信公众号自定义分销商城小程序源码系统是一款功能强大的电商解决方案,它集成了商品管理、订单处理、支付接口、分销管理等多种功能。该系统支持自定义界面设计,商家可根据自身需求调整商城的页面布局和风格,打造独特的品牌形象。同时,系统还提供了丰富的营销工具,如优惠券、满减活动、限时折扣等,帮助商家吸引更多用户,提升销售额。 代码示例 系统特色功能 (一)商品管理      商品添加

动作捕捉、表情捕捉技术:高效率打造高品质数字人角色动画

#行业现状# 动作捕捉与表情捕捉技术作为当代影视动画制作的重要技术手段,已被广泛应用于各领域,如文旅宣传片、非遗文化传承表演动画、裸眼3D动画、程序动画、音乐舞蹈MV动画、游戏买量动画、虚拟主持人动画等等,通过动作捕捉与表情捕捉技术将真人演员的表演内容一一呈现于数字人上,极大地增强了动画的观赏性和视觉表现力,更能符合当代审美需求。 广州虚拟动力一直深究于动作捕捉技术领域,致力于为各领域

通过阿里云的PAI基于开源LLM搭建RAG检索增强对话系统

5月9日参加阿里云AI云峰会活动,学习了下如何借助阿里云的PAI服务进行搭建RAG检索增加对话系统。 前提: 为了方便省钱,建议先通过免费的优惠圈,这样就可以先不花钱学习一下啦。开始实验之前,请务必打开 阿里云免费试用 - 阿里云,先后搜索“EAS”和“oss”,领取试用活动,如下图: 1. EAS简介 EAS(Elastic Algorithm Service)是PAI的模型在线服务

##24 多模态深度学习基础:框架、应用与展望

文章目录 前言1. 多模态学习的概念与重要性2. 关键技术框架2.1 数据表示与特征提取2.2 模态融合策略2.3 多任务学习 3. 应用实例3.1 医疗图像分析3.2 自动驾驶汽车3.3 情感分析 4. 挑战与未来展望结语 前言 在深度学习的世界中,多模态学习是一个令人兴奋的前沿领域,它旨在整合来自不同数据源的信息,例如文本、图像和音频,以创造出能更全面理解和处理复杂数

TMC4671超越传感器和摄像头之外——将物联网从云端转移到现实世界[应用案例]

在早期,物联网 (IoT) 在很大程度上充当了云端服务的“眼睛和耳朵”,收集传感器、摄像头和其他物理世界输入设备的数据,而不太注重操纵或控制它所监视的事物。支持物联网的自动化和机器人应用已经开始合并,但是一般而言,它们的成本使它们只能用于高端工业和商业市场。然而,最近,嵌入式运动控制设备已经开始使智能、安全、低成本的电动产品的开发成为可能,这些产品与物联网的眼睛和耳朵有着同样强大的关节和手指。

SOCKS5代理、代理IP在跨界电商和游戏行业中的应用

在全球化的背景下,中国的跨界电商和游戏行业企业不断拓展国际市场,寻求新的增长点和竞争优势。成功的出海战略不仅依赖于市场洞察和文化适应能力,还需要利用先进的网络技术来确保高效、安全的业务运营。SOCKS5代理、代理IP以及全面的网络安全措施,正是这些企业在全球市场中脱颖而出的关键技术。 SOCKS5代理:提升网络性能与安全 SOCKS5代理是一种支持多种协议(包括TCP和UDP)的网络代理协议,

微信在线预约系统怎么做_让您的业务更高效!

在这个数字化飞速发展的时代,传统的业务预约方式已经逐渐无法满足现代人的需求。随着智能手机的普及和微信用户数量的不断攀升,微信在线预约系统已成为许多企业和个人提升服务效率、优化客户体验的不二之选。今天,就让我们一起探讨微信在线预约系统的魅力,看看它如何助力您的业务腾飞! 工具/原料 微信小程序 微信人家网站 方法/步骤 一、微信在线预约系统的优势 便捷性:用户只需通过微信扫描二维码或

2022 年高教社杯全国大学生数学建模竞赛-C 题 古代玻璃制品的成分分析与鉴别详解+聚类模型Python代码源码

前言 简单介绍一下我自己:博主专注建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。参与过十余次数学建模大赛,三次美赛获得过二次M奖一次H奖,国赛二等奖。**提供免费的思路和部分源码,以后的数模比赛只要我还有时间肯定会第一时间写出免费开源思路。**博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码且完全免

【Unity学习笔记】第十六 World space、Parent space和Self space及Quaternion左乘右乘辨析

目录 World space、Parent space和Self space不同坐标系下的移动不同坐标系下的旋转——Quaternion左乘右乘的区别辨析总结 参考: Unity 世界坐标&局部坐标下的旋转Quaternion multiplication orderlocal space vs global space vs object space in unity3dTr