Unity学习笔记 Vol.70 使用动画绑定(Animation Rigging)制作程序化的角色动画
摘要
这节,我们接着上一节继续研究动画绑定的内容。详细教程请参考官方视频。

教程

我们将学习如何使用动画绑定(Animation Rigging)包,为人物添加动画 ,使用人物更具动态,使骨架能程序化地查看周围、看看关注点。场景中有两个人物,他们都带有骨架和闲置动画,我们希望两人闲置时可以到处看,让人物更有生气、更加有趣。我们可通过制作额外的动画剪辑、切换动画来实现,不过还有个更简单的方法。

其实,我们可使用动画绑定(Animaiton Rigging)工具来控制人物的身体部位,在播放闲置动画的同时,叠加上头部的位置变化。首先,我们需要在Package Manager中,将动画绑定(Animation Rigging)包安装到项目中。维京人已经会到处看了,但弓箭手还是只盯着一个方向,那么我们先让弓箭手在站着的时候能往四处看。

我们首先需要为人物装好动画绑定(Rigging)工具,在人物根对象上添加Rig Builder组件,为了方便使用骨架,我们可以添加Bone Renderer脚本和骨骼的Transform来可视化骨架。


新建一个头部骨架(Head Rig),添加到Rig Builder中。

关于使用动画绑定(Animation Rigging)制作人物骨架的更多信息。可查看此前制作的基础知识教学,上一节有相关的内容。
接着,我们需要控制头部的转向,可使用Multi-Aim Constraint组件实现,Mullti-Aim Constraint组件,可以让游戏对象转向场景中特定的点。

在骨架中,新建游戏对象,称为Head Aim,添加Multi-Aim Constraint组件。

在Aim的Transform中新加一个游戏对象,称为AimTarget,将其稍微拖到人物的前方,再添加一个效果器,来可视化目标位置。

在Multi-Aim Constraint组件中,将人物骨架的头部Transform拖入作为Constrainted Object。

将Aim Axis设为前方向,即在下拉菜单中选择z,接着,将AimTarget设为源对象(Source Object),让HeadTarget看到AimTarget。

现在进入Play模式,四处拖动Aim Target对象,闲置动画依旧会在人物上播放,头部则同时会向着AimTarget转动。现在我们能控制人物闲置时的视线位置了,你可以通过为目标添加动画,来制作简单的头部动画。

但我已经编写了一个闲置动画控制脚本,可随时间推移随机移动目标位置,这下头部每秒就会随机转动,为人物添加更多生气,动画已经很不错了,但人物的眼睛仍旧是静止的,如果能让眼睛独立于头部运动,人物可以更加活灵活现。

在骨架中新建游戏对象,称为 Eye Aim,在其中为每只眼添加游戏对象,接着为左眼添加Multi-Aim Constraint组件,将人物骨架中的左眼设为Constraint Object,将Aim Axis设为z,将头部的Aim Target设为Source Object。

右眼的操作相同,不过Aim Axis需要设为z,这时播放场景并没有什么变化,这是因为眼睛和头部的IK权重是相同的,两者在跟踪目标时的移动距离是相同的。

不过,如果我们选中头部游戏对象,在检视器中更改权重,注意头部回到了闲置位置,而眼睛依旧会锁定 Aim Target四处转动,如果将权重设为0.755,头部依旧会向Aim Target移动,但速度要比眼睛慢得多,这种效果虽然不起眼,但可以为人物多添加一点生气。另一种使用该功能添加人 物生气的方法,是创建关注点(Point of Insterest)。目前,弓箭手并不会注意到维京人,如果他能关注到任何附近角色就好了,我希望弓箭手的Aim Position,在两者之者的距离小于一定范围时,可以盯着维京人的头。

我们可以为弓箭手添加简单的overlapsphere计算,将维京人的头作为关注点来实现,我在弓箭手上编写了一个称为Look At Nearby脚本。

脚本会执行一个简单的OverlaspSphere计算,以人物头部为中心点向外辐射一定的半径,为人物添加一个球型的视区,来搜寻所有附近的碰撞体。

脚本接着检查球型视区中是否有碰撞体,如果有则检查其是否带有Point of Interest组件。

Point of Interest组件是一个最简单的组件,仅储存一个瞄准用的目标Transform。

当Point of Insterest被指定到维京人上时,Look At Nearby脚本,会将Aim Target移向Point of Interest目标,当目标不再可见,Look At脚本会将目标位置重设为原点。

在弓箭手上,我们指定头部Transform来配置好功能,确保型视区能从正确的高度投射出来。

将Aim Target的Transform指定到弓箭手的骨架。

暂时禁用Aim Idle脚本,防止与Look At Nearby脚本冲突。

我在脚本中使用了OnDrawGizmo函数,来在场景中可视化球型视区。

我们来将Vision Radius设为1.25。

将Lerp Speed设为20。

接着我们只需将维京人设为人物的关注点就行了。如果我们将维京人设为碰撞体,添加Point of Interest组件,就能把头部设定为视线的目标。播放场景,当维京人走过弓箭手时,弓箭手会盯着维京人,当两者距离够远,维京人走出视锥时,弓箭手头部会返回到起始位置。

我们也能为附近的对象添加Point of Interest脚本,让人物能盯着它看。

可以看到,动画绑定(Animation Rigging)可为游戏制作更多动态人物,人物间可以相互互动,让场景更具生气。