Unity射击游戏中不同的动画会导致枪的位置错乱,往往需要使用Animation Rigging来进行动画的约束,完成瞄准IK和手部IK的目标。关于Rigging有很多介绍,但网上的教程实际使用起来很困难,特别是多个约束之间互相覆盖的问题。我这里主要使用Multi Aim Constraint和Two Bone Constraint来完成比较理想的瞄准。
首先为了符合逻辑,通常会把枪设为手部骨骼下,如果不将枪设置在骨骼中,倒是方便实现瞄准,但场景一旦复杂起来,如何设置枪的位置和逻辑也很麻烦。
在瞄准时,枪是以枪托在肩膀的位置做杠杆运动,所以会在枪托位置设一个空物体作为枪的父节点,再使用Multi Aim Constraint约束使该空物体转向目标,以此带动枪指向目标。
因此希望三种约束:
- 位置约束将枪托约束在肩部位置
- 瞄准约束将枪以枪托为中心旋转到目标方向
- 手部做Two Bone约束,把手放在枪把的位置。
理论上应该按这种顺序进行约束,但出现了一个问题。因为枪是手的子物体,在前两步对枪单独约束时,会使手和枪的相对位置发生偏移,再进行第三步约束时,手就握不住枪了。
更糟糕的是这个相对偏移量是实时计算的,因此无法通过修改枪的位置使手始终握住枪。
只要瞄准的支点在枪托的位置就无法解决,把支点改到枪把的位置倒是可以解决枪把浮动的问题,但在一些身体幅度较大的动画时,比如走路,枪托就会离开肩膀的位置
主要原因就是在约束过程中对枪这个子物体进行了操作,因此无法带动手部动作,要么就放弃以枪托为支点的旋转,要么将手也加为支点的子物体,但这样会导致骨骼关系错乱。
解决办法:
既然瞄准是通过手转动肩膀的支点实现的,那只要知道手的位置在哪,然后把手放到这个位置就可以解决问题。
- 为了不破坏手和枪的父子关系,在人物的肩膀骨骼下建一个空物体为WeaponShoulderPosition,对WeaponShoulderPosition使用Multi Aim约束使其指向目标。
- 在WeaponShoulderPosition下新建一个空物体RightHandConstraint_target,保证RightHandConstraint_target在WeaponShoulderPosition的瞄准方向上,则这个WeaponShoulder就相当于虚拟的枪,RightHandConstraint_targe就是这把枪的把手位置。
- 3. 然后对右手使用Two bone约束,目标位置就设在RightHandConstraint_target的位置,再进行 细调RightHandConstraint_target就可以了(注意调完了要copy一下)。
因为左手和枪没有父子关系,直接把LeftHandConstraint_target放在握把上就行,注意不要让身体的aim rig权重太高,否则会出现握不住握把
rig顺序:
- 身体Aim Constraint
- 虚拟武器 Aim Constraint
- 头部Aim Aim Constraint
- 右手Two Bone Aim Constraint
- 左手Two Bone Aim Constraint