unity code-动作系统Animator

2023-11-15

AnimatorOverrideController是运行时版本

可以运行时更改controller,AnimatorController是编辑器版本,不能运行时修改,所以运行时只能通过用AnimatorOverrideController来替换才行

CreateObject

Animator是动作状态机的入口,他是继承Behaviour的,所以他能拖到gameobject上去

AwakeFromLoad首先执行CreateObject,他会先清理对象ClearObject();

avatarConstant = m_Avatar->GetAsset();这个是获取Avatar对象,是动作的对应的avatar对象,会拿到骨骼信息来做动作。

申请内存大小:

mecanim::animation::CreateAvatarConstant是用来创建avatar的AvatarConstant,然后设置human属性,骨骼属性等,

mecanim::animation::CreateAvatarMemory是创建avatar的内存地址大小,跟数据结构有关。

mecanim::animation::CreateAvatarInput是输入内存大小申请

mecanim::animation::CreateAvatarWorkspace是创建avatar的骨骼等内存对象,

这些申请的过程都是alloc.Construct<>();的方式申请的。

CreateAvatarOutputreateAvatarOutput是输出内存大小申请,

CreateAvatarBindingConstant创建avatar的绑定数据结构申请,

SetAvatarPosition(transform.GetPosition()); SetAvatarRotation(transform.GetRotation()); SetAvatarScale(transform.GetWorldScaleLossy());

这里设置avatar的位置旋转缩放信息。

editor下创建对象:

然后就是对AnimatorController的GetAssets,m_Controller->GetAsset(),因为AnimatorController只针对editor下创建,运行时只获取,所以editor下执行BuildAsset。

这里时获取animtorcontroller里面的属性,是在AnimatorControllerParameter中的m_AnimatorParameters的属性。

然后写入到mecanim::ValueArray中。

状态机:

然后状态机的处理:

这里是通过m_AnimatorLayers拿到所有animator的层级,然后加入到stateMachineIndexVector索引中。

这里是获取每一层的动作剪辑然后放到stateMachineVector。

这里包括是否有ik,是否混合,是否有权重,身体遮挡,骨骼遮挡。

在AnimationSetBindings中。

m_AnimationSetBindings = UnityEngine::Animation::CreateAnimationSetBindings(m_Controller, GetAnimationClips(), m_Allocator);

这里就是拿出输入的绑定,动作剪影以及申请的内存,所有设置到outputBindings中。

设置状态机树状结构以及混合:

在Animator::CreateObject()的m_Controller->GetAnimationSetBindings();后通过SetupControllerMecanimDataSet设置animation的数据到outMecanimDataSet中。

在Animator::SetupControllerMecanimDataSet中UpdateLeafNodeDuration是更新动作状态机的树的数据结构。

然后通过animation::BlendTreeMemory *GetBlendTreeMemory设置混合树到arStateMemory.m_BlendTreeMemoryArray中。

avatar动画系统:

在AvatarBuilder下的BuildAvatar就是创建avatar动作的地方,

GenerateAvatarMap:

然后执行AvatarBuilder::GenerateAvatarMap,首先他会通过GetAllChildren来获取所有子对象,然后如果是kHumanoid类型通过GetHipsNode来找到hip骨骼节点就是他的根骨骼节点,如果是kGeneric类型则通过GetRootMotionNode找到根节点。

如果有用mask功能,则会在GetAllChildren的时候通过mask的才加入到对象列表。

然后他会申请内存ChainedAllocator,大小是30*1024。这个内存大小用于后面的BuildSkeleton,CreateSkeletonPose,nameIDArray,BuildHumanSkeleton,BuildRootMotionSkeleton

BuildSkeleton:

通过CreateSkeleton来创建Skeleton数据结构

并对每个骨骼赋值

avatarPose和avatarGPose 是通过CreateSkeletonPose创建出来的局部的pose数据和global的pose数据。

ReadFromLocalTransformToSkeletonPose

然后ReadFromLocalTransformToSkeletonPose是namedTransform中读取位置缩放旋转的值放到SkeletonPose的m_X中。

然后SkeletonPoseComputeGlobal是赋值到avatarGPose 也就是global的pose。

然后还会创建avatarDefaultPose就是默认的pose。

leftHandValid和rightHandValid是找到左手和右手。

BuildHumanSkeleton

然后如果是humen类型则BuildHumanSkeleton创建骨骼,humanPose和humanGPose对应人体的局部和全局pose。然后通过CreateHuman来创建人体骨骼结构,里面已经对应好骨骼的关系

struct Human

后面赋值到这些结构体中。

然后mecanim::skeleton::SkeletonPoseCopy(avatarSK,avatarGPose,humanSK,humanGPose);这里是赋值骨骼数据到humanGPose中。

然后设置三块

是他的重力以及他的轴和他的碰撞体。

最后让Avatar这个结构体SetAsset设置avatarConstant的数据到Avatar类的m_Avatar中。

完成创建。

在CharacterTestFixture.h的CreateAvatars中有相关的例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity code-动作系统Animator 的相关文章

  • Redis基础

    一 Redis入门 1 Redis简介 Redis Remote Dictionary Server 即远程字典服务 是一个基于内存的key value结构数据库 是用C语言开发的一个开源的高性能键值对 key value 数据库 它可以用

随机推荐

  • 基于python 蔬菜价格数据分析 完整代码+数据

    https download csdn net download weixin 55771290 87567123
  • GRU解决预测分类问题(多变量预测多步)

    解决问题的背景 现有五个属性列 前四个属性列作为特征输入 第五个属性列作为标签值 第五个属性列的意义是类别 先需要通过前50步的数据特征预测后10步的类别 即 51 60步 1 直接多输出的方式 直接多输出的方式就是在神经网络的最后加上几个
  • Linux·DNS协议、ICMP协议、NAT技术

    目录 DNS协议 DNS背景 编辑域名简介 域名解析过程 使用dig工具分析DNS过程 ICMP协议 ICMP功能 ICMP协议格式 编辑ping命令 一个值得注意的坑 traceroute命令 NAT技术 NAT技术背景 NAT IP转换
  • 报错:‘NoneType‘ object has no attribute ‘shape‘

    报错 NoneType object has no attribute shape import cv2 as cv img cv imread images1 print img shape img shape 图像大小 行 列 通道数
  • TypeScript基础入门 - 枚举 - 联合枚举与枚举成员的类型

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 转发 TypeScript基础入门 枚举 联合枚举与枚举成员的类型 项目实践仓库 https github com durban89 typescript demo git
  • Unity中添加按钮的方式

    方式一 使用 GUILayout 自动布局 用 GUILayout Button 来创建按钮 会自动的在屏幕的右上角按列排列按钮 这种方式添加的按钮大小和位置都无法改变 为默认值 private void OnGUI if GUILayou
  • f5负载均衡配置文件服务器,f5 负载均衡 dns 服务器 配置

    f5 负载均衡 dns 服务器 配置 内容精选 换一换 查询负载均衡器状态树 可通过该接口查询负载均衡器关联的监听器 后端云服务器组 后端云服务器 健康检查 转发策略 转发规则的主要信息 了解负载均衡器下资源的拓扑情况 GET v2 pro
  • mongodb入门操作

    mongodb入门操作 简单了解一下NoSql NoSql NoSql not only sql 是非关系型数据库系统的统称 它用于超大规模的数据的存储 提供有限的查询功能 mongodb mongodb是一个基于分布式文件存储的数据库系统
  • Rabbit学习笔记

    引言 什么是MQ MQ Message Quene 消息队列 通过典型的生产者和消费者模型不断向消息队列中生产消息 消费者不断从队列中获取消息 因为消息的生产和消费是异步的 而且只关系消息的发送和接收 没有业务逻辑的侵入 轻松地实现系统间解
  • IMU的ROS调试开发工具包:imu_tools

    目录 imu tool包 问题 参数配置便利性问题 实例 调试microstrain 3dm gx5 25 imu 问题 发布的imu姿态与实际imu姿态不一致问题 imu tool包 http wiki ros org imu tools
  • Java串口通信-JSerialComm

    Java串口通信 JSerialComm 目前网上的Java串口通信主要使用RXTXComm 但是这个库已经很久没有更新 最近的更新似乎在2012年 并且与JavaFX集成打包时会出现BUG JSerialComm是一个较新的串口通信库 其
  • 深度学习——权重的初始值

    权重的初始值 权重的初始值十分重要 关系到神经网络的学习是否成功 可以将权重初始值设置为0吗 为了抑制过拟合 提高泛化能力 采用权值衰减的方法 它是一种以减小权重参数的值为目的进行学习的方法 在误差反向传播法中 所有的权重值都会进行相同的更
  • truss 命令

    truss 命令用途跟踪进程的系统调用 动态装入的用户级函数调用 接收的信号和造成的机器故障 语法truss f c a l d D e i t x Syscall s Signal m Fault r w FileDescriptor u
  • gitlab 搭建与使用

    gitlab 搭建与使用 参考博客链接 https blog csdn net weixin 38912024 article details 82383312 https blog csdn net hao5335156 article
  • JasperReport6.x 提示:No markuo processor factory specified for ““ markup

    Jaspersoft Studio 提示如下错误信息 No markuo processor factory specified for markup 解决方法 jrxml 切换至源码模式 查询makeup 属性字段标签 将内容编辑为 no
  • ssh: connect to host port 22: No route to host问题

    笔记本没电自动关机 但是虚拟机是开启状态 开机之后发现连接不上其中一个虚拟机 出现了ssh connect to host port 22 No route to host问题提示 后来检查防火墙和网都没有问题 使用ifconfig命令后发
  • ie 使用window.open页面报错

    window open url 打开新页面是如果要通过地址栏来传参要注意 var qt qt teachMaterialDealInfo bookids selectBooks qt teachMaterialDealInfo writer
  • vba文字型的值转换成数值类型

    今天在做表的时候 发现数组中提取出来的是文字类型 需要转换成数值类型 网上搜索到了字符转换的方法 超级实用 记录下来 如果用mid函数提取的字符范围增加 可参照VBA中的帮助 类型转换函数 CBool expression CByte ex
  • 正则表达式匹配数字、字母和汉字等各类汇总

    最近在开发中遇到一个需求是只匹配字母和汉字 于是在网上找了一个比较全的记录一下 日后再用 正则表达式来匹配规范一段文本中的特定种类字符 下面是对常用的正则匹配做了一个归纳整理 1 匹配中文 u4e00 u9fa5 2 英文字母 a zA Z
  • unity code-动作系统Animator

    AnimatorOverrideController是运行时版本 可以运行时更改controller AnimatorController是编辑器版本 不能运行时修改 所以运行时只能通过用AnimatorOverrideController