ダンスげーを作りたい#7 【解決】HumanoidでAnimationClip再生中に腰の位置を動かして上下運動させたい
タイトルの通り、腰ボーンの位置をスクリプトから動かして上下運動させたいという願望のため、戦い続けてまいりましたが、ようやっと解決しました。
それ何に使うの?って思われてると思います。
どこでそれ使いたいかといいますと、
今回の目標はダンスゲームを作ることで、
今回は踊りを3要素に分解し、腕の動き、足の動き、腰の上下でそれぞれを組み合わせてダンスをします。
足の動きと手の動きは、それぞれアバターマスクでも適用して、アニメーションクリップで適用しますが、
上下運動(=リズム的な要素)をつかさどる部分は、
アニメーションとは独立した腰ボーンの移動によって変化してほしい&足もいい感じに曲がってほしいけどアニメーションをぶち壊さないでほしい。
というわけで、アニメーション再生中に腰ボーンを動かしたいわけなんですね。
正解はAnimationRiggingにあり
なんと一度、うんともすんとも言わず諦めたAnimationRiggingが大正解でした。
もう一度今までの手法をおさらいしていると、
どうやらAnimationRiggingはAnimation中のHumanoidに対しても有効で、Animationの外からボーンをいじくるためのものっぽい。
という理解に至りました。
正しいかはさておき、まさしくそれを求めてたわけです。
早速、テストスクリプトつけまくってけがれてしまったテストモデルちゃん(タイルマン)を祓って、サラピンのHarukoちゃんを用意しました。
リファレンス読んでちゃんと設定したら…
うごいたー!
こうして事態は解決へと向かいます。
やってみた
ここまでくれば、腰が動かせずとも
”足IKが床を貫通したら床位置に合わせる”
でいいわけです。
しかしながら、上の動いてるHarukoちゃんはなんかぎこちないですね。
これは足IKが床にへばりついてるからです。
足IK位置も一緒にアニメーションしてほしいですね。
なら、動いてる足先に追従するオブジェクトを足先のIKにすればいいんですよ。
それぞれの足IKに、所定のボーンの位置を参照して追従させるMulti-PositionCnstraintを付けました。
これで動くしIKもついてる足が完成しました。
この状態で、全体の位置を動かし、IKの位置が床より下になったら床に合わせるスクリプトを書いて設定すると。。。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IKmovetest : MonoBehaviour
{
[SerializeField]Transform Leftfoot; //左足IK
[SerializeField]Transform Rightfoot; //右足IK
[SerializeField]Transform Root; //本体
public float updown; //腰の上下幅(今は制限ないけど、ないと飛ぶ&ケツ埋まるので要設定)
void Update(){
//本体の位置を移動
Vector3 rootpos=Root.position;
rootpos.y=updown;
Root.position=rootpos;
//移動後の足の位置を取得
Vector3 lpos = Leftfoot.position;
Vector3 rpos = Rightfoot.position;
//めり込んでるときは床位置に合わせる
if(lpos.y<0.0f){
lpos.y = 0f;
}
if(rpos.y<0.0f){
rpos.y = 0f;
}
//ハメる
Leftfoot.position = lpos;
Rightfoot.position = rpos;
}
}
完璧すぎて自分が恐ろしいですね。
注意点
コード内のコメントにもありますが、移動値には上下限が必須です。
この場合、初期ポーズで足を延ばしている以上、+の値を入れれば足が床から離れて飛んじゃうので、上限値は"0"。
ケツが0を下回ればケツが埋まってしまうので下限値は"-ケツの高さ"です。
腕も埋まっちゃう可能性はあるので、腕にも同様の処理は必要ですが、まぁその辺はご愛敬レベルなので後で直せばいいでしょう。
これで要素は一通りそろったので、ここからは小さな機能たちをつなぎ合わせてシステムにしていきます。
早くUIデザインするフェーズに入りたいなー。
ではまた。
この記事が気に入ったらサポートをしてみませんか?