こちらはUnity Advent Calendar 2021 18日目の記事です。
購入したアニメーションアセットを使う場合など、既存のモーションを別キャラクタに適応する際に左手と武器などの持ち物の位置がずれることがあります。(両手持ち武器のアニメーションなど)
このようなズレはIKを利用することで簡単に修正することができます。
IKPassの有効化
キャラクタのIK制御を有効にするためにAnimatorのLayerタブ > 設定(歯車マーク) > IKPass
にチェックを入れます。
武器に左手の持ち手部分を作る
画像のように左手の持ち手部分に空オブジェクト(LeftHandPoint)を作成しておきます。
また、武器自体はキャラの右手に持たせておきます。
LeftHandPointの座標へキャラの左手を移動させるスクリプトを作成
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LeftHandMatcher : MonoBehaviour
{
private AvatarIKGoal ikGoal = AvatarIKGoal.LeftHand; // IK制御を行う体の部分(今回は左手)
[SerializeField] private Transform leftHandPoint;
private Animator anim;
public bool isEnableIK = true; // IK制御有効化フラグ
// Start is called before the first frame update
void Start()
{
anim = GetComponent<Animator>();
}
private void OnAnimatorIK() { // OnAnimatorIKはIK制御情報を更新する際に呼ばれるコールバック
if (!isEnableIK)
return;
// 武器に作成したLeftHandPointに、左手を移動させる
anim.SetIKPositionWeight(ikGoal, 1f);
anim.SetIKRotationWeight(ikGoal, 1f);
anim.SetIKPosition(ikGoal, leftHandPoint.position);
anim.SetIKRotation(ikGoal, leftHandPoint.rotation);
}
}
作成したスクリプトはキャラクタにアタッチします。
アタッチしたスクリプトのLeftHandPointに先ほど武器側に作成したLeftHandPointオブジェクトをアタッチします。
角度・位置の調整
スクリプトアタッチ後、実行してみるとIK制御が有効になっており、左手が持ち手部分に移動していることがわかります。
この時に手の位置や角度がおかしい場合はUnityを実行状態のままLeftHandPointオブジェクトの角度・位置を変更します。
結果
IK制御をすることでモーションそのものを改変することなくズレを解消できました。
オリジナル | IK制御中 |
また、IK制御中は画像のようにモーションを切り替えても、LeftHandPointに左手が追従するため、モーションごとに調整は必要ありません。
今回は武器とのズレ解消にIKを利用しましたが、レバーを引く際に手をレバーに合わせる、宝箱を開けるときに手を箱の蓋に合わせるなど、さまざまはズレ解消に利用できると思います。