这周更新了一下人物动画。参考Unity自带的ThirdPersonCharacter样例,人物的控制分为两层,第一层为动画控制,直接对 Animator的参数进行更改,控制人物的动画;第二层为AI控制,进行人物的决策控制,并输出指令利用第一层的控制系统对角色进行控制。粗略的简单层级关系图如下所示:
下面记录一下具体实现的步骤。
骨骼绑定+动画
这里使用了Mixamo,一个带自动骨骼绑定功能的动画库(需要Adobe Creative Cloud会员)。
在Maya中把模型导出为FBX,以下是当时的选项(关闭了Animation,并勾选了若干输出选项)。
导出模型后,登陆http://www.mixamo.com,点击Upload Character上传模型。在上传过程中遇到过几次失败,尝试调整FBX导出选项(如果操作得当的话,模型的材质,BlendShape都是可以保留的)。上传成功后,需要手动标注一些重要关节点的位置。如下图所示,其中的带有颜色的圈圈即为需要手动调整的部分。
设定完成后,按Next,系统就会自动进行骨骼绑定。当然绑好的带人骨骼的模型也是可以直接上传的。完成绑定之后,就可以在动画库中挑选所需要的动画了。基本的动画这里面还是比较齐全的,而且基本都是mocap的动画,效果非常自然。下图中,左侧为动画库搜索栏,右侧为人物动画演示;最右端为一些动画的微调,但是够调节的东西十分有限。
选择好动画后点击下载,然后选择好下载的格式即可。
下载完成后导入Unity中,在Rig一栏最好选择Humanoid来支持人物动画的混用。Avator需要选上,这里选的是CreateFromThisModel,来支持动画更改gameobject的坐标。
在Animations一栏中选择好动画的起始终止帧。勾选LoopTime表示动画会循环播放。另外如果在上一步定义了Avator的话,在这一步会显示loop match,如果动画有行走或者转向这里的绿灯会变红。所以变红并不是说明动画有错误,而是告诉开发者动画将会改变模型的哪方面的数值。
Animator设计
Unity自带的ThirdPersonCharacter实现了最基础的动画状态机,我以此为基础,增加了一substate,命名为Action用于加入自定义的动画:
事实上Animator的设计,根据角色动画的需要可以有很多不同的样式。这里放一个我觉得做得比较好的例子:
状态机如上,基本的陆地行走(Locomotion),空中动画(Fall)和跳跃动画(Jump)之外还增加了游泳(Swim)动画。Locomotion为一个BlendTree,设计如下:
红点所在位置为Idle动画,往上走分别是由慢到快的行走动画,总共有四个层级,左右两边是选择动画,下方是向后走的动画。一个行走的状态已经使用了20个动画了。
另外还有在死亡,受伤,进行攻击时触发的动画。
以受伤动画为例,来自不同方向的伤害会播放不同的动画。
不过由于我们游戏里的人物没有那么复杂的状态,所以基本的动画系统即可。
动画控制层级设计
这里直接使用的是Unity 源生的ThirdPersonCharacter.cs的代码。
人物AI设计
人物的AI一般可以用一个状态机来表示,我设计的人物状态机如下:
一开始人物在喝酒(Drinking),在玩家与之对话之后,会与玩家争吵(Argument),之后会追逐(Chase)玩家。判定追上,会攻击玩家(Hit),然后进入缓冲状态(Wait),之后重新开始追逐玩家。
由于有了上一级的动画控制代码,在这里只需要进行代码的调用而不用触碰动画本身了。比如Chase状态的Update代码如下:
m_stateMachine.AddUpdate (State.Chase, delegate {
// Move toward the MainCharacter
Vector3 toward = MainCharacter.Instance.transform.position - transform.position ;
// Call the Move function from the previous level
m_character.Move( (toward.normalized + avoidObstacle ) * speed , false , false );
// Check if you can Hit the Main Character
if ( CheckMCInFront())
m_stateMachine.State = State.Hit;
});
把各种零部件拼装好后,一个带有AI的角色也就完成了
测试
放到场景中看一下效果:
开始是一个在喝酒的糟老头。
交谈后会站起来,开始追逐玩家。
抓到玩家后会来一记右勾拳。
嗯,大概就是这么一个效果啦~