----2022.04.09----
利用新的InputSystem和Cinemachine结合动画状态机实现人物的走、跑、相机环绕。
具体操作见:[使用动作数据实现简单运动](./controller_motion.md)
# 背景
在readme文件中我们已经完成了将修改好的VRM模型导入到Unity中,并且调整为URP管线兼容的Shader了。

接下来在本篇中,将讲述如何使用[Mixamo](https://www.mixamo.com/)的动作数据到Unity的VRM模型中使用。
> Mixamo为adobe的开源动作数据,可以用于商用等,直接使用这个动作可以解决我这样程序er的动画k帧苦手者
# 具体步骤
## 1.从MIXAMO中下载动作数据
- 进入[MIXAMO](https://www.mixamo.com/)的页面
- 
- 选择一个动作,然后点击右边的Download下载
- 可以在右边的预览窗口里面具体的看效果 & 一些动作可以做调整
- 做全套的动作推荐使用左上角的搜索功能搜索:“pack”,然后可以找到一个全套的locomotion
- 
- 但是全套动作的下载下来只有动作数据没有模型数据,所以需要再下载一个Tpose的模型到时候把动作数据放到Tpose的fbx里面到时候导出
- 点击下载
- 
- <font color="red">注意下载时不能只下载动作数据(要with skin)!纯动作数据在导入Unity后从Generic转为Hunmanoid类型的AnimationType时通过Create From this Model创建avatar会发生Tpose的偏移,导致整体动作都是变形的!</font>
- 解压下载的压缩包,可以看到每个动作的独立fbx文件
- 
于是动作数据就下载好了。
如果是loco的还需要再下载一个With Skin的Tpose资源。
## 2.将多个动作数据用Blender调整并导出为一个fbx文件
### a.不需要调整的情况
如果上面下载的动作数据是With Skin的,可以直接拖拽fbx到Unity里面。
- 
- 这时候你会发现如果把动作数据的预览模型换为VRM模型的,会发现动作是不正常的
- 
- 把Rig \-> AnimationType \-> Generic改为Hunmanoid,点击Apply然后就
- 
- 然后就可以等着在AnimatorController里面用了,把动作数据Ctrl+D复制出来之后其他的部分都可以直接删除了。
- 
- 改名之后,就能直接在Animator里面使用了
### b.需要导入Blender中处理的情况
有时我们会希望把动作进行些许的修改,于是就需要导入到一个3D软件中操作。
> 在这里提供Blender的操作方式
- 新开一个Blender窗口
- File \-> Import \-> Fbx
- 如果没装FBX插件,需要自己安装一个fbx的导入插件,网址:[链接](https://github.com/absolute-quantum/cats-blender-plugin.git)
- 然后跟着教程安装插件,最后重启窗口
- 导入时记得勾选:Automatic Bone Orientation,不然骨骼会不正确
- 
- 导入,然后就可以调整动画的帧了
- 
- 这里先导入的是Tpose模型,改下名字
- 
- 然后开始导入动作数据了,每次新导入一个fbx就马上把animation的命名改了;修改的方法如图
- 
- 导入和修改的参考视频可以看:[链接](https://www.youtube.com/watch?v=VNbzOjiYJk4)
- 全部动作数据导入完改完名字后大概是这样的:可以把Character以外的Armature删除了
- 
- 这时候把不需要的Armature给隐藏掉,然后可以切换者看看骨骼动画效果和调整骨骼动画
- 
- 然后如果想要可以在这里先保存一下Blender文件,以后好回来改效果。接下来就可以导出了。
- File \-> Export \-> File,记得勾选Bake Animation和设置Forward为Z轴,然后导出
- 
- 导出的时候我们会把人物网格一起导出,但是没关系,在Unity里面再做处理把多余东西去掉
## 3.将导出的fbx动作导入Unity
其实就是上面的 a.不需要调整的情况 的做法。
- 将导出的fbx文件直接拖拽进Unity
- 可以看到导入的东西是这样的,会有多余的人物。接下来会进行调整
- 
- 点击Rig,修改AnimationType为Hunmanoid然后Apply
- 
- 然后将预览窗口的模型替换为我们的VRM模型,就能看到模型在正常执行了
- 
- 如果左右转向之类的转不动、跳不起来,记得把人物的Animator组件的Apply Root Motion勾选上
- 于是这里的动作就都可以用到Animator里面挂给状态了
- 如果只想留下动作数据那就选出骨骼动画数据,然后Ctrl+D复制出来,把原FBX删除即可
## 4.踩坑记录
#### a.骨骼偏移,姿势扭曲
数据从Blender导出到Unity导入时,一定要带有一个模型,这个模型推荐是Mixamo的官方模型,这样才能保证将AnimationType从Generic转为Hunmaniod的时候不会发生骨骼偏移的BUG。
是否偏移可以在点进去看。
- 不偏移(正常的):
- 
- 偏移的:
- 
发生偏移原因大概是从Generic->Hunmaniod时使用的是Model来做的变换,而但单纯的动作数据是没有模型的。
### b.运动方向有偏移
为什么Mixamo的动作方向在Unity里这么怪?在预览中播放人会走着走着发生x或者z轴上的偏移,比如直线向前跑的动作在位移上会往左边或者右边偏移?
这是因为从Mixamo下载到的动作数据都是RootMotion的,而在将骨骼从Generic转变为Hunmaniod的时候预测出来的前方向有问题,不是很贴合。可以通过调整Clip的RootTransformRotation和RootTransformPosition的选项来控制。
- 人直行走歪:
- 
- 如果是不涉及旋转的动作可以勾选Bake Into Pose则当前Clip不会影响人物的旋转
- 将Based Upon设置为Original,即使用动作数据原本的方向
- Offset可以用来设置偏移值,进行抵消微调
- 负值会往人物的右手边偏移,正值会往左边
记录一下Clip窗口的配置意义:
- LoopTime:是否循环
- LoopPose:是否将动画的首尾进行混合连接
- CycleOffset:循环的偏移
- RootTransformRotation:旋转的RootTransform
- BakeIntoPose:是否使用原地动画,即人物实际的旋转不使用动作的旋转=动作不影响人物实际朝向
- BasedUpon:基于的方向,
- Origional:使用动作的方向,如果有偏移可以试试使用它
- Body Origional:使用人物的方向
- Offset:使用的偏移值补正,比如一直往右偏可以给个正值来抵消
- RootTransformPositionY:Y轴位移的RootTransform
- BakeIntoPose:是否使用原地动画,即人物实际的旋转不使用动作的位移,依靠CharacterController之类的代码来控制位移=动作不影响人物的实际位移
- 其他都和上面一样
- RootTransformPositionXZ:XZ轴位移的RootTransform
- 和上面的一样
## 5.参考教程或文档
- Mixamo官网:https://www.mixamo.com/#/
- **如何使用Mixamo的骨骼动画做自己的模型动画并且导入到Unity中获得idle walk runing turn等动作的骨骼动画序列**:https://www.youtube.com/watch?v=VNbzOjiYJk4
- 轻松解锁2500个游戏人物动作:https://www.bilibili.com/video/BV1oZ4y1p7ay
- 这个视频里面讲了如何把多个Mixamo的骨骼动画合并在一个fbx文件中
- 并且讲了手贱多创建了Action可以怎么删除
- 骨骼动画从一套骨骼迁移到另一个:https://www.bilibili.com/video/BV1Bf4y1q7aQ
- blender 2.8 动画入门学习:https://www.bilibili.com/video/BV19a4y1t77B
- Blender中做Mixamo的动作融合 : https://www.bilibili.com/video/BV1gV411e7xQ
- Blender中做骨骼动画的融合:https://www.bilibili.com/video/BV1mT4y1m7YX
- blender角色动画应该怎样导入Unity:https://www.bilibili.com/read/cv9558600
- 通过Mixamo生成人物动画并导入Unity实现资源可用的方法:https://blog.csdn.net/Fly_fish1/article/details/108958053