2022/07/29

HandIKAppier for Unity

Hand IK apply on Timeline for Unity

UnityでHumanoidアニメーションIKを扱う場合、FootIKはClipにOn/Offがあるんでいいですが、HandIKの場合、普通はAnimationControllerでIKPassを有効にして、コンポーネントのOnAnimatorIK()内で処理コードを書きますよね。
じゃあPlayableDirector(Timeline)の場合は?
DirectorとAnimationControllerは排他関係にありますので、Directorで動かす場合はAnimationControllerは外しますね。OnAnimatorIK()受けるためだけに、無理やり同時使用するのも出来なくはないですが、ワーニング出るし気持ち悪いです。

今回作ったのは、モーキャプしたモーションをDirector/Timelineで再生する際にモーションのHandIKを使えるようにするスクリプトです。
Gist: https://gist.github.com/hiroshi-nishiura/9a696e2f5ba28fc82e410f8c16dc09c9

適応したいAnimatorが付いているオブジェクトもしくはその配下のオブジェクトにつければ機能します。左右それぞれのウエイト調整ができます。なぜウエイトかというと体格によっては手がターゲットに届かなくて腕がピーンってなってしまうのでどのくらい近づけるかというウエイト値になってます。
PlayableDirectorはどこにあってもいいものなので、Directorの場所もコンポーネントに教えてやります。Directorを設定しない場合は普通にOnAnimatorIK()が動きます。両対応ってことです。

Directorで動いているAnimatorでどうやってIK処理するかですが、IAnimationJobを使いました。Directorが作成するPlayableGraphからAnimatorに対応する出力にAnimationScriptPlayableノードを追加します。
このノードからJobにAnimationHumanStreamが渡ってきますので、JobのProcessAnimation()内でIK処理をやってます。
AnimationJobに関しては https://github.com/Unity-Technologies/animation-jobs-samples が参考になります。
DirectorのGraphに関しては情報がほとんどなく、ちょっと難儀しました。
因みに、AnimationControllerのGraphをいじろうとするとReadOnlyでいじれませんでした。DirectorのGraphは編集可能でよかったです。