当前位置: 首页 > article >正文

u3d动画系统六【动画根运动】

一.案例演示

demo说明:模型循环执行奔跑动画,模型受动画自带的位移影响,其transform(XZ的position)发生变化

二.根运动相关概念

身体变换:模型质心在场景中的Transform信息。

根变换:根变换是身体变换在 Y 平面上的投影,和动画所在游戏物体的Transform一致。

在动画的预览视图中,可以看到身体变换和根变换位置,如上图所示

可以通过animator类访问身体变换和根变换,如上图所示

根变换数据和gameObject的Transform数据一致

身体变换数据positionY设为0就是根变换数据

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Robot : MonoBehaviour
{
    private Animator m_animator;
    void Start()
    {
        m_animator = GetComponent<Animator>();
    }
    //通过LateUpdate打印的信息和Inspector中一致,Update比Inspector中的慢一帧
    private void LateUpdate()
    {
        Debug.Log(string.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}", Time.frameCount,
           m_animator.bodyRotation.x, m_animator.bodyRotation.y, m_animator.bodyRotation.z,//身体变换-rotation
           " | ", m_animator.bodyPosition.x, m_animator.bodyPosition.y, m_animator.bodyPosition.z,//身体变换-position
           " || ", m_animator.rootPosition.x, m_animator.rootPosition.y, m_animator.rootPosition.z//根变换-position
           ));
    }
}

参考官方手册:根运动 - 工作原理

三.demo设置说明

3.1 Animator的apply root motion

勾选:动画本身的运动会改变gameObject的transform属性

不勾选:动画本身的运动不会改变gameObject的transform属性

3.2 动画根运动相关设置

选中动画文件,选中Animation页签,下方的设置是和根运动有关的,如上图所示

Unity将模型的运动分为3种类型:旋转,Y方向运动和XZ方向运动,如上图所示

在对存在根运动的动画进行设置时,Animator中的Apply Root Motion相当于一个总开关,这里3种运动类型的设置相当于分开关

Bake Into Pose:勾选上会让动画在该变换类型上不会影响根运动(也就不会影响gameObject对应类型的Transform)。根据动画运动的特征进行勾选,Demo中奔跑动画而言,不会旋转,Y方向无位移,XZ上有位移。

Based Upon和Offset用来调整身体变换信息,Based Upon用来控制初始状态,Original表示取模型中对应的原始数据,Offset用来调整偏移量,这两个选项更改后,可以在动画预览视图中观察变换,所见即所得,如下图所示

四. 脚本控制根运动

适用情况:角色一部分动画需要关闭根运动,一部分动画需要启动根运动

4.1 需要有根运动的动画设置标签

4.2 OnAnimatorMove事件方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Robot : MonoBehaviour
{
    private Animator m_animator;
    void Start()
    {
        m_animator = GetComponent<Animator>();
    }

    private void OnAnimatorMove()
    {
        if (m_animator.GetCurrentAnimatorStateInfo(0).IsTag("run_motion"))
        {
            transform.position += m_animator.deltaPosition;
        }
    }
}

OnAnimatorMove内先检测执行的是根运动动画,transform的值加上动画产生的变化量(deltaPosition)即可

Animator 组件将检测到脚本有函数OnAnimatorMove并将 Apply Root Motion 属性显示为 Handled by Script

参考官方手册:为“原地就位”的人形动画编写根运动脚本


http://www.kler.cn/a/440757.html

相关文章:

  • AI视频配音技术创新应用与商业机遇
  • 基于 Cell 架构的安全防护:现代应用程序领域的深度剖析与应对策略
  • 中英文网店系统运营风险 跨境电商平台法律与税务处理
  • 工业大数据分析算法实战-day07
  • #Js篇:map结构转普通js普通对象
  • Python毕业设计选题:基于django+vue的宠物服务管理系统
  • 汽车故障码 B100117 供电电压过高的解析及消除方法
  • 如何通过命令行解锁 macOS Gatekeeper(并恢复默认设置)
  • Ubuntu 系统下安装 Nginx
  • 戴森球计划新玩法!利用MOD和cpolar实现公网环境多人游戏
  • 游戏引擎学习第53天
  • Kafka实现监听多个topic
  • 2、C#基于.net framework的应用开发实战编程 - 设计(二、一) - 编程手把手系列文章...
  • 第19天:信息收集-Web应用源码获取闭源备份开发泄漏WebPack打包资源搜索ICO定位
  • ElasticSearch系列:索引分片调整
  • 奇绩创坛公开课第01课_创业走出第一步_陆奇:学习笔记
  • shell脚本目录下所有文件中关键词替换方法
  • K8s 如何自己实现云上的proxy代理
  • 手眼标定工具操作文档
  • 接口数据做缓存,响应飞快似天神