动画在游戏中的重要性不言而喻 , 当在调试时发现角色动画没有按照预期工作 , 实在是一件让人纠结的事情 . 为此 , 我曾不止一次的在博客发过解决这类问题的文章 ( 参见《正确设置了 AnimTree,但运行后角色无动画的问题解决》《修复 UDK 骨骼动画或 IK 不正确(动画异常)的问题》 )

今天仍旧讨论这一主题,不过是从根骨骼运动和动画组的层面入手。

如果您发现在调试游戏时角色出现闪动、不正常位移那么就有可能是由于根骨骼运动没有正确工作导致的;若您发现角色动画播放有时正常,有时异常,且动画之间过渡存在问题则有可能是因为没有正确设置动画组导致的。

本文将先从涉及  UnrealScript 的根骨骼运动部分开始,之后再介绍动画组。

根骨骼运动

这里我们仅讨论没有正确设置根骨骼运动所导致的问题并解决他们。

上图中的红线事实上就是根骨骼的运动距离,要将这段运动正确的表现出来,需要正确的设定动画节点或者书写脚本。若您使用了具有根骨骼运动的动画,却没有正确设置,那将有可能导致该动画播放完毕后,角色“闪”回原位置(不正常位移)的问题。

  • 设定动画节点:可以为某个指定的 AnimNodeSequence 节点启用根骨骼运动,下图加粗的项均是与根骨骼运动相关的项目。这里需要注意一个 Zero Root Translation 选项,当您即使设置了 Root Bone Option,可根骨骼运动仍然不能正确表现,请勾选此项。

  • 脚本代码:可以用 UnrealScript  控制根骨骼运动来实现更强大、更灵活的功能。下面是位于自定义 Pawn 类的部分代码,这是一个非常简单的示例:
//初始化游戏
simulated function PostBeginPlay() {
Super.PostBeginPlay();
if (Mesh.RootMotionMode != RMM_Translate) {
//设置根骨骼运动模式为 RMM_Translate
Mesh.RootMotionMode = RMM_Translate;
}
}
//初始化动画树
simulated event PostInitAnimTree(SkeletalMeshComponent SkelComp) {
//设置动画节点的根骨骼选项,其中 CustomAnimATK 是一个自定义播放动画节点
CustomAnimATK.SetRootBoneAxisOption(RBA_Translate,RBA_Translate,RBA_Translate);
}

注:有关根骨骼运动的详尽解释请参阅《UDN根骨骼运动》

动画组

动画组是非常重要却容易被新手忽视的内容(因为没有真正理解动画组的意义,至少我起初是这样#_#)。动画组在操作上并没有任何难点,需要注意的是,不仅仅是走、跑、跳这样基础的动画需要同步,像某个独立的攻击动画同样需要使用动画组。

您应该为每个有效的 Animation Node Sequences 分配动画组,以保证动画可以按照预期工作。

注:有关动画组的详尽解释,请参阅《UDN动画概览—动画组》