Unity第三人称瞄准时遇到的问题和解决办法

本文介绍了在Unity射击游戏中使用AnimationRigging进行瞄准IK和手部IK约束时遇到的问题,通过MultiAimConstraint和TwoBoneConstraint解决枪托定位和手部跟随问题,以及调整rig顺序以保持手部与枪的正确交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unity射击游戏中不同的动画会导致枪的位置错乱,往往需要使用Animation Rigging来进行动画的约束,完成瞄准IK和手部IK的目标。关于Rigging有很多介绍,但网上的教程实际使用起来很困难,特别是多个约束之间互相覆盖的问题。我这里主要使用Multi Aim Constraint和Two Bone Constraint来完成比较理想的瞄准。

首先为了符合逻辑,通常会把枪设为手部骨骼下,如果不将枪设置在骨骼中,倒是方便实现瞄准,但场景一旦复杂起来,如何设置枪的位置和逻辑也很麻烦。

在瞄准时,枪是以枪托在肩膀的位置做杠杆运动,所以会在枪托位置设一个空物体作为枪的父节点,再使用Multi Aim Constraint约束使该空物体转向目标,以此带动枪指向目标。

因此希望三种约束:

  1. 位置约束将枪托约束在肩部位置
  2. 瞄准约束将枪以枪托为中心旋转到目标方向
  3. 手部做Two Bone约束,把手放在枪把的位置。

理论上应该按这种顺序进行约束,但出现了一个问题。因为枪是手的子物体,在前两步对枪单独约束时,会使手和枪的相对位置发生偏移,再进行第三步约束时,手就握不住枪了。

更糟糕的是这个相对偏移量是实时计算的,因此无法通过修改枪的位置使手始终握住枪。

只要瞄准的支点在枪托的位置就无法解决,把支点改到枪把的位置倒是可以解决枪把浮动的问题,但在一些身体幅度较大的动画时,比如走路,枪托就会离开肩膀的位置

主要原因就是在约束过程中对枪这个子物体进行了操作,因此无法带动手部动作,要么就放弃以枪托为支点的旋转,要么将手也加为支点的子物体,但这样会导致骨骼关系错乱。

解决办法:

既然瞄准是通过手转动肩膀的支点实现的,那只要知道手的位置在哪,然后把手放到这个位置就可以解决问题。

  1. 为了不破坏手和枪的父子关系,在人物的肩膀骨骼下建一个空物体为WeaponShoulderPosition,对WeaponShoulderPosition使用Multi Aim约束使其指向目标。
  2. 在WeaponShoulderPosition下新建一个空物体RightHandConstraint_target,保证RightHandConstraint_target在WeaponShoulderPosition的瞄准方向上,则这个WeaponShoulder就相当于虚拟的枪,RightHandConstraint_targe就是这把枪的把手位置。

  1.    3. 然后对右手使用Two bone约束,目标位置就设在RightHandConstraint_target的位置,再进行  细调RightHandConstraint_target就可以了(注意调完了要copy一下)。

因为左手和枪没有父子关系,直接把LeftHandConstraint_target放在握把上就行,注意不要让身体的aim rig权重太高,否则会出现握不住握把

rig顺序:

  1. 身体Aim Constraint
  2. 虚拟武器 Aim Constraint
  3. 头部Aim Aim Constraint
  4. 右手Two Bone Aim Constraint
  5. 左手Two Bone Aim Constraint

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值