さわぐちFMオキーステーション

幸せの鐘が鳴り響き僕はただ嬉しいふりをする

Animation Riggingでキャラクターに銃を持たせてみる

Animation Riggingとは?

blogs.unity3d.com

以下原文ママ

Unity 2019.1 向けの Animation Rigging パッケージは、アニメーション化されているスケルトンに対して実行時にプロシージャルなモーションをセットアップできるようにするものです。一連の定義済みのアニメーションのコンストレイントを使用して、キャラクターの制御リグ階層を手動で構築することができるほか、C# で独自のコンストレイントを構築することもできます。 これにより、ワールドとのインタラクション、スケルトン変形リグ、物理演算ベースの二次モーションなど、ゲームプレイ中に各種の魅力的な表現が可能になります。

Unity内のオブジェクトにリグを設定して動かしたりIKを設定できたりします。今回はその機能を使ってキャラクターに銃を持たせるサンプルを作ってみます。

今回のサンプルで使用しているアセットはこちら

assetstore.unity.com

assetstore.unity.com

(別にこのアセットである必要はないです)

Packageのインポート

まだPreviewパッケージなのでPreviewを有効にして「Animation Rigging」をインポートします

f:id:amidaMangrove:20200801221505p:plain

シーンをセットアップ

とりあえず、キャラクターと適当な待機モーションを設定したキャラクターをシーンに配置します。

f:id:amidaMangrove:20200801222016p:plain

Breaking Badのウォルター・ホワイトっぽいキャラ。この姿勢の状態で銃を持たせたいと思います。

ボーンを表示してみる

とりあえず最初にエディタ上で操作するボーンを表示したいと思います。Bone Rendererコンポーネントを使用することでサクッと表示できます f:id:amidaMangrove:20200801222421p:plain

今回動かす肩→肘→手のボーンを表示してみます。

f:id:amidaMangrove:20200801222517p:plain

同様の手順で右手側も表示してみましょう。

f:id:amidaMangrove:20200801222620p:plain

Rig BuilderとRigの設定

まずは銃を持たせたいキャラクターに「Rig Builder」コンポーネントをアタッチします。Rig LayerにRigを設定したオブジェクトを設定することで実行されます。 f:id:amidaMangrove:20200801223129p:plain

次に持たせたいオブジェクトをキャラクタの階層に配置します。

f:id:amidaMangrove:20200801222955p:plain

適当に銃の高さを調整しておきます。これは後からでも調整できるのでおおよその位置で。

f:id:amidaMangrove:20200801223345p:plain

次にキャラクターの階層に空のオブジェクトを作成し「Rig」コンポーネントをアタッチします。今回のサンプルでは「HandGunRig」という名前にします。

f:id:amidaMangrove:20200801223523p:plain

f:id:amidaMangrove:20200801223607p:plain

Rigコンポーネントはそのコンポーネントの子で設定したリグのWeightを変更することができるコンポーネントです。 そしてこのRigコンポーネントがアタッチされているオブジェクトを「Rig Builder」に設定しておきます。

f:id:amidaMangrove:20200801224835p:plain

Two Bone IK Constraintを設定する

先ほど作った「HandGunRig」の子オブジェクトに空のゲームオブジェクトを作り、「Two Bone IK Constraint」をアタッチします。名前は「RightHandRig」にしておきます。

この「Two Bone IK Constraint」コンポーネントを使用することで2つのボーンのFKを指定したゲームオブジェクトをターゲットにして制御できるIKに変換することができます。

右腕を動かしたいので肩、肘、手をそれぞれRoot、Mid、Tipにわたします。

f:id:amidaMangrove:20200801224337p:plain

「Source Objects」にターゲットとなるゲームオブジェクトを設定するので、先ほど配置した銃の子オブジェクトに空のゲームオブジェクトを配置してそれを指定してあげます。名前は「RightHandTarget」とかに設定しておきます。

f:id:amidaMangrove:20200801224534p:plain

この「RightHandTarget」を「Two Bone IK Constraint」の「Source Objects」に設定します。

f:id:amidaMangrove:20200801225018p:plain

で、ここまで設定したら一度実行してみましょう。

f:id:amidaMangrove:20200801225058p:plain

一応手は銃に向かって伸びてますが位置や角度がおかしいので「RightHandTarget」のTransformを調整しましょう。実行しながら変更しCopy ComponentでCopy→終了してPasteとやるとやりやすいです。

f:id:amidaMangrove:20200801225412p:plain

銃が動いた場合でも追従させる

「RightHandTarget」を動かすとその位置に腕が動いてくれるのですが、親となる「銃」を動かしても追従してくれません。 f:id:amidaMangrove:20200801225546p:plain

この問題を解消するには親である銃に「Rig Transform」をアタッチしてあげます。

f:id:amidaMangrove:20200801225801p:plain f:id:amidaMangrove:20200801230409g:plain

これで銃に追従するようになりました!

肘の広げ方が気に入らない場合、「Source Objects」のHintを調整してみましょう。右ひじ付近に空のゲームオブジェクトを作り、Hintに渡します。

f:id:amidaMangrove:20200801231214p:plain f:id:amidaMangrove:20200801231254p:plain

これで肘の開き方を調整することができるようになります。 f:id:amidaMangrove:20200801231330p:plain

左手にもリグを設定

右手でやったことと同じ処理を左手にも設定します。やった内容のコピペで大体いけると思います。 f:id:amidaMangrove:20200801231928p:plain f:id:amidaMangrove:20200801231947p:plain f:id:amidaMangrove:20200801232001p:plain f:id:amidaMangrove:20200801232019p:plain

細かい位置を調整してあげれば完成です。 f:id:amidaMangrove:20200801231836p:plain

ちょっと他アニメーションと組み合わせてみました。銃が固定されてちょっと不自然ですがwまぁこれは後でなんとかするということで。 f:id:amidaMangrove:20200801233011g:plain