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中有相关的例子。

unity code-动作系统Animator相关推荐

  1. Unity用户手册-动画系统Animator

    动画系统Animator 动画类型 Legacy 基础的动画 Generic 动画,包含动画状态机 Humanoid 人形动画,包含动画状态机 Update Mode Normal 动画播放将与Upd ...

  2. Unity的Animation系统以及Animator的详细介绍

    学习目标: 学习内容: 学习时间: 学习产出: 我们可能会卡住,点击mixamo回到主页面然后再进来就不会卡了 1.首先我们得知道Mixamo是什么? Adobe旗下免费的动画开源网站 2.其次,我们 ...

  3. Unity进阶 - 动画系统 - 给人物角色制作动画

    Unity进阶 - 动画系统 - 给人物角色制作动画(点击免费试学本节) 上一篇文章,我们对Unity进阶 - 动画系统 - Mecanim动画系统有了一定的认识,本节课我们给人员角色制作一些简单的动 ...

  4. Unity Mecanim动画系统 之 动画层(Layers)和 动画遮罩(Avatar Mask)的简单使用

    Unity Mecanim动画系统 之 动画层(Layers)和 动画遮罩(Avatar Mask)的简单使用 目录 Unity Mecanim动画系统 之 动画层(Layers)和 动画遮罩(Ava ...

  5. Unity Mecanim动画系统 之 IK(Inverse Kinematics即反向动力学)的相关说明和简单使用

    Unity Mecanim动画系统 之 IK(Inverse Kinematics即反向动力学)的相关说明和简单使用 目录 Unity Mecanim动画系统 之 IK(Inverse Kinemat ...

  6. 【Unity】动作游戏开发实战详细分析-16-敌人AI设计

    [Unity]动作游戏开发实战详细分析-16-敌人AI设计 基本思想 本文来实现简单的敌人AI,使用协程来开发AI.如果想要使用行为树插件可自行学习使用. 代码实现 敌人的目标信息结构 用于存储所有的 ...

  7. 【Unity】动作游戏开发实战详细分析-15-可扩展的战斗系统

    [Unity]动作游戏开发实战详细分析-15-可扩展的战斗系统 系统设计 攻击信息传递 通常情况下,伤害.属性.判定都会被封装到类中,在触发动画事件后将战斗信息发送给受击者. 我们可以结合Unity碰 ...

  8. 云服务器unity,Unity 离线建造系统

    Unity 离线建造系统 很多游戏,特别是养成类手游,都会有自己独特的建造系统,一个建造装置的状态循环或者说生命周期一般是这样的: 1.准备建造,设置各项资源的投入等 2.等待一段倒计时,正在建造中 ...

  9. Unity Mecanim动画系统 之 动画混合树(Blend Trees)的简单使用

    Unity Mecanim动画系统 之 动画混合树(Blend Trees)的简单使用 目录 Unity Mecanim动画系统 之 动画混合树(Blend Trees)的简单使用 一.简单介绍 二. ...

最新文章

  1. SQLite.swift的简单使用
  2. vsftpd服务安装与虚拟用户配置
  3. [爬虫]通过url获取连接地址中的数据
  4. (下)python3 selenium3 从框架实现代码学习selenium让你事半功倍
  5. ios企业应用发布流程
  6. maven项目没有src/test/java和src/test/resources目录问题解决
  7. 贪心 区间覆盖最小值
  8. express 模板 及 文件上传
  9. java之tomcat搭建文件服务器
  10. 【转贴】谈谈企业经营管理中的八大黑洞
  11. 20210312 plecs外部模式把示波器视野扩大
  12. docker 启动 redis cluster,使用出现CLUSTERDOWN Hash slot not served(redis cluster重新分配slot)
  13. python webdriver脚本例子_python-webdriver 开始第一个脚本
  14. 关于Python面试的4点,你做到就吃鸡了!
  15. 移动笔试计算机知识,移动笔试知识点之--计算机类-数据库系统概论复习资料
  16. 使用PADS绘制排线的细节笔记
  17. 大数据征信|芝麻信用、腾讯信用和51信用卡等信用评分模型解析
  18. ARCGIS格式转CAD时保留其图层、高程及颜色的方法
  19. CAS和自旋到底是一个概念吗?
  20. 交叉线、直通线、反转线的区别与应用

热门文章

  1. 来自未来的交互设计。当电影中的一切变为现实,设计师要如何进化?
  2. 企业微信加载html模板,企业微信公众号页面模板使用的方法是什么?
  3. 高中生活--第5篇--学英语的故事(四大难题)
  4. EAUML日拱一卒-微信小程序实战:位置闹铃 (15)-实现监控点状态迁移功能
  5. MIT-BIH-ECG使用
  6. rust php 扩展,在PHP程序中使用Rust扩展的方法_php技巧
  7. php程序yii是什么意思,【PHP开辟框架】yii是什么意义
  8. 对于霸榜视频超分领域的VRT方法的深度解读
  9. 第九届“中国软件杯”大学生软件设计大赛总决赛落幕
  10. java 日食还是月蚀_你了解人们常说的日食与月食吗?