【Unity】キャラクタの手の高さに比例して手の形状を切り替える

キャラクタがダンスなどのモーションを行っているときにずっと手がパーの状態だと寂しいので,動的になるように施す.よく忘れるのでメモ.

Env.

  • Unity2019.1.12f1
  • UniVRM 0.55

Methods

手のアニメーションクリップを用意

手の高さに応じてグーとパーを切り替えたい.今回であれば手を上に上げたときにグーに,手を下げたときにパーになるようにしたいので,1秒間でグーとパーを切り替えるだけのアニメーションクリップを用意した.左右の手を別々に制御させたいので,左手と右手それぞれのアニメーションを作成した.

名前は適当にHand_LとHand_Rにした.それぞれ0:00にパーの状態,1:00にグーの状態を保存.
animファイルを新規作成するのは面倒なので,以下に作成したものを置いておく.

https://github.com/nmxi/Unity_pth_HandsController/releases/tag/v0.1

AnimationMaskを作成

左と右の手のマスクをそれぞれ作成しておく.

上記は左の手のマスクの例.これと反転させてものも作成する.

プロジェクトタブはこのような感じになる.

AnimationControllerを用意

適当な名前でアニメーションコントローラーを作成して,当該キャラクタオブジェクトに付いているAnimatorコンポーネントにアタッチしておく.

上記のように何もアニメーションが入っていない適当な名前のAnimationLayerを作成して,左手と右手それぞれのAnimationLayerを作成.先程作成したAnimationMaskをそれぞれのレイヤーにアタッチする.

左手と右手のレイヤーのDefaultAnimation(オレンジのノード)がそれぞれの1秒間のアニメーションクリップを設定しておく.

アニメーション(手のグーとパー)が勝手に動かないようにするため,DefaultAnimationのノードの設定はインスペクタから以下のように設定しておく.

とりあえず,Speedを0にしておく.

Animationの再生位置をスクリプトからコントロール

HandController.cs

適当なGameObjectに貼り付けて以下のようになる.

あとはTargetAnimatorに当該キャラクタモデルのAnimatorをアタッチしてPlay中に_l_HandParamと_r_HandParamを0.0~1.0もしくは0.2~0.8など範囲を調整しながら,変更させるだけ.

このように手が動くようになる.

キャラクタの手の高さを取得

上記のHandController.csを改造して,モデルの手の位置からグーとパーが切り替わるようにした.
以下のコードだとしゃがんだときや,ジャンプしたときなどに対応できないので,もっときれいに自然に動かすのであれば,HipsのlocalPositionからの手のlocalpositionの相対距離を取得したりする必要がある.

ReferenceAxisはpositionのx, y, zどの値を参照するかを変更できる.特になにも考えない場合,Yで大丈夫だと思う.
HandMaxPosとHandMinPosは手をグー,パー切り替える高さのブレイクポイントを指定する.

これらを設定して,手の高さがが高くなったときにグー.低くなったときにパー.といったようにアニメーションができるようになる.リアルタイムでのモーションの入力にも対応できる.

動作の見本を載せたかったが,全身見せられるモデルを用意する時間がなかったので,また今度.

あー.手のモーキャプ装置ほしい.

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です