问题解释
先说出下现这个问题的原因。影响这个问题的原因有两个:
-
动画剪辑导入
现在模型导入的逻辑是:如果模型中存在动画,那么有动画的结点会被正确导入,但是没动画的结点会被强制插入一帧当前的结点变换(动画)。
-
动画图运行时
运行时,一旦发现一个结点存在动画,该结点被动画系统接管——每一帧开始前,该结点的变换会被重置为一开始的值,然后执行动画逻辑。
再说下为什么 Creator 选择这么做。
起初,有用户反应动画表现不正确,其提供的模型类似如下:
模型层级结构:
Pelvis
Foot
动画 A 中存在的动画:
结点 /Pelvis TRS
结点 /Pelvis/Foot TRS
动画 B 中存在的动画:
结点 /Pelvis/Foot TRS
用户反应,当先播放一次 动画 A
后,动画 B
效果不正确——他期望动画 B 播放时,结点 /Pelvis
就是初始的姿态。
为了解决这个问题,Creator 在导入动画时,强制为所有没动画的结点加了一帧。
为什么 3.7.x 没有问题。
是的,动画图从 3.8.0 开始更新了底层框架。以前,在动画图发现一个动画剪辑有某个结点的动画,但是由于这个结点被遮罩过滤了,那么它就不算做有这个动画。而 3.8.0 开始,某个结点的动画是否生效并未考虑遮罩。
解决方案
现在立即可行的解决方案有两个。
在 lateUpdate() 里覆盖动画
可以将对 Paotadian
的代码操控在 lateUpdate()
里,来覆盖动画图的结果。
使用 3.8.0 新增的程序式动画功能
具体做法如下:
-
加入一个层级到最后,为这个层级附加一个遮罩,使得只有
Paotadian
结点生效。 -
在该层级的顶层状态机中,加入一个“程序式姿态`,并使该状态作为入口状态。
-
编辑添加的 “程序式姿态”,添加姿态结点 [应用变换],根据逻辑需求设置“位置操作”、“旋转操作”,并创建相应的三维向量变量或四元数向量,将它们连接为 [应用变换] 的输入。
-
将 [应用变换] 连接至 [输出姿态]。
-
在代码中,设置步骤 3. 创建的位置/旋转变量。
我做了个 Demo 给你:
tank.zip (168.4 KB)