前置き
Blenderで “刀を両手で握って構えるアニメーション” を作り、UnityにImportしてみたところ、画像のように左手の位置がずれてしまう事態に直面した。
これをちゃんと握っているようにするため、unityのIk機能を使って修正した時の手順メモ。
公式サイト
https://docs.unity3d.com/ja/2022.2/Manual/InverseKinematics.html
手順
①Animatorの設定
Animatorウィンドウを開いてBaseLayerの箇所にある歯車アイコンを選択し、表示されたポップアップ内の 「IK Pass」にチェックを入れる。画像のように 「IK」の文字が表示されていればOK。
②武器の持ち手部分に空オブジェクトを追加する
自分の場合は「Katana」が所持対象の武器なので、その子要素としてCreate Empty で空オブジェクトを追加、ついでにリネームしておく。
③スクリプトを作成
公式https://docs.unity3d.com/ja/2022.2/Manual/InverseKinematics.htmlからコピーして使用。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IkControl : MonoBehaviour
{
protected Animator animator;
public bool ikActive = true;
public Transform leftHandObj = null;
void Start ()
{
animator = GetComponent<Animator>();
}
// IK を計算するためのコールバック
void OnAnimatorIK()
{
if(animator) {
// IK が有効ならば、位置と回転を直接設定します
if(ikActive) {
if(leftHandObj != null) {
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand,1);
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand,1);
animator.SetIKPosition(AvatarIKGoal.LeftHand,leftHandObj.position);
animator.SetIKRotation(AvatarIKGoal.LeftHand,leftHandObj.rotation);
}
}
//IK が有効でなければ、手と頭の位置と回転を元の位置に戻します
else {
animator.SetIKPositionWeight(AvatarIKGoal.LeftHand,0);
animator.SetIKRotationWeight(AvatarIKGoal.LeftHand,0);
}
}
}
}
でこのスクリプトを、ヒエラルヒー内にある調整したいキャラクターにアタッチする。そしてinspector内のプロパティとして、②の工程で作成した空オブジェクトを設定する。
自分の場合は②で作ったのは KatanaGripTargetLeftだったので、それを LeftHandObjの箇所に設定する。
④調整する
この時点でシーンを再生してみると、確かに動きはしたが凄くグニャっとなっていた。
これを修正するため、ヒエラルキー内にある②の工程で作成した空オブジェクトを選択する。再生しながらまずPositionを調整し、おおよその位置が決まれば inspectorの 値をコピーする。
再生を停止すると再生中にいじったプロパティはリセットされるものの、コピーしておいた値をpasteすることで位置の修正が可能。
同じ要領でRotationの項目も修正していく。一発で思った通りにはならなかったものの、この作業を数度繰り返してとりあえず手の位置は修正できた。
コメント