おもちゃラボ

Unityで遊びを作ってます

【Unity】Animation Clipで設定した位置を相対的な値として扱う方法

AnimatorでAnimation Clipを動かすと、アニメーションの位置はAnimation Clipに設定されている値が優先されて表示されます。

例えば、原点でバウンドするボールのアニメーションを作ると、その後でボールを移動させても、実行時には原点でバウンドするボールに戻ってしまうのです。

f:id:nn_hokuson:20170424192512j:plain

Unity5ではRoot Motionを設定することで、Animation Clipで設定したアニメーションの位置を相対的なものとして扱うことができます。ここではRoot Motion機能を使って移動後の場所でアニメーションを再生する方法を紹介します。

アニメーションを作成する

まずはボールが跳ねるアニメーションを作りましょう。

シーンビューに球を配置して、その球を選択した状態でメニューバーから「Window」→「Animation」を選択します。出てきたAnimation Windowの「Create」ボタンをクリックしてhopという名前で保存しておきます。

f:id:nn_hokuson:20170424192527p:plain:w400

続いて「Add Property」→「Transform」→「Position」を選択して、アニメーションを作成します。今回はアニメーションカーブを次のように配置してみました。

f:id:nn_hokuson:20170424192535p:plain:w500

さてこの状態で実行してみると、原点を軸にしてボールがバウンドします。このボールを無理やり端っこに持っていってもやはり原点でバウンドしてしまいます。

f:id:nn_hokuson:20170424192631j:plain:w400

Generate Root Motion Curbを設定する

Root Motionを設定することで、Animation Clipに設定された値を相対的なものとして扱えるようになります。ここでは球にRoot Motionを設定して、移動先でバウンドするようにしましょう。

まずは作成した「hop」のAnimation Clipを選択し、インスペクタから「Generate Root Motion Curb」のボタンをクリックします。

f:id:nn_hokuson:20170424192709p:plain:w300

続いて、SphereにアタッチされているAnimatorコンポーネントの詳細をインスペクタに表示し、「Apply Root Motion」のチェックを入れます。

f:id:nn_hokuson:20170424192733p:plain:w300

これによりRoot Motionが有効になります。ゲームを実行してみると移動後の場所でボールがバウンドするようになります。

f:id:nn_hokuson:20170424192738g:plain

まとめ

Animatorを使った場合、通常ではAnimation Clipに設定された座標が優先されて使われます。Root Motionを使うことで、オブジェクトを移動しても移動先でアニメーションを再生することができるようになります。

AnimatorやAnimation Clipに関しては「Unity5の教科書」でも説明していますので、あわせて参考にしてみてくださいね^^

【Unity】オブジェクトを破棄するタイミングで効果音を鳴らしたい

オブジェクトを破棄(destroy)する直前で効果音を鳴らそうとしても、オブジェクトが破棄されると、AudioSourceコンポーネントもあわせて破棄されてしまうので効果音が鳴りません。 
 
たとえば、シューティングゲームでは、ミサイルが敵にあたったタイミングで、爆発音を鳴らしますね。この場合、敵もミサイルも破棄するので、どちらのオブジェクトにAudioSourceコンポーネントをアタッチしても爆発音は鳴りません。

f:id:nn_hokuson:20170421195844p:plain:w450

この対策として、破棄するオブジェクトとは別に効果音用のオブジェクトを作っておき、そのオブジェクトで効果音を鳴らすというのが常套手段かもしれません。ただ、小さいデモ用のプロジェクトでこれをするのは、すこし面倒です。
 
そんなときに使えるのが、PlayClipAtPointメソッドです。このメソッドは、鳴らしたいオーディオクリップと座標を引数に指定すると、指定した場所に新しく一時オブジェクトを生成し、効果音を鳴らしてくれます。

引数 意味
clip 再生するためのオーディオデータ
position 音の発生源からのワールド空間内の位置
volume 再生時の音量

 
しかもしかも!効果音の再生が終わったら、一時オブジェクトは自動的に破棄されるのでゴミオブジェクトが残ることもありません。
 f:id:nn_hokuson:20170421201258j:plain

たとえばミサイルクラスで効果音を鳴らすには、次のようなプログラムになります。

public class MissileController : MonoBehaviour 
{
    // 爆発効果音
    public AudioClip explosionSE;
        
    void OnCollisionEnter2D(Collision2D other)
    {
        if( other.gameObject.tag == "Enemy" )
        {
             // オーディオを再生
             AudioSource.PlayClipAtPoint( explosionSE, transform.position);
             // ミサイルオブジェクトを破棄
             Destroy(gameObject);
        }
    }
}

  
PlayClipAtPointメソッドは案外知られていませんが、unityでサクッと試作を作りたいときには、重宝するメソッドですね!
 

【Unity】Blenderで人型のボーンを入れて、Animatorで走るアニメを再生する

人型の3Dモデルにボーンを入れるのは、手作業でやると結構大変です。Blenderにはアーマチュアと呼ばれる人型のボーンが用意されており、これを使えば簡単に人型のボーンを入れることが出来るようになります。

f:id:nn_hokuson:20170420201957j:plain

簡単なはず・・・なのですが、最初にやろうとすると手順が多くて大変だったりします(笑)この記事では、ハマリポイントも合わせて、ボーンの入れ方からUnityのAnimatorで動かすまでの流れを説明します。

Rigfyを使わずにボーンを入れる手順はこちらの記事で説明しているので、スクラッチでボーンを入れたい方はあわせて参考にして下さい。
nn-hokuson.hatenablog.com

Rigifyの有効化

まずはRigifyが使えるようにAddonを有効化します。
メニューバーから「ファイル」→「ユーザー設定」→「アドオン」と選択し、「Rigging:Rigify」の右側のチェックボックスにチェックを入れてください。

f:id:nn_hokuson:20170420194705p:plain:w400

アーマチュアの設定

自分の作成したモデルをロードし、人型のアーマチュアを設定しましょう。「Shift+A」→「アーマチュア」→「Human」を選択して下さい。

f:id:nn_hokuson:20170420194720p:plain:w400

すると、下図のような人型のボーンが作られます。

f:id:nn_hokuson:20170420194725p:plain:w450

この人形のボーンをmeta rigといいます。これを自分の作った3Dモデルにフィットするように移動・回転・拡大縮小してください。

f:id:nn_hokuson:20170420194757p:plain:w450

注意:メタリグはポーズモードではなく、編集モードで編集してください

モデルとリグを関連付けましょう。「モデル→「リグ」の順番に選択して、「Ctrl+P」で「自動のウエイト」を選択します。順番が大切です!

f:id:nn_hokuson:20170420194841g:plain

これで、リグを動かすとモデルも動くようになりました!(おい・・・)

f:id:nn_hokuson:20170420201537g:plain

ちなみに、「自動のウエイト」を選択したときに「ボーンヒートウェイト:一つ以上のボーンで解決に失敗しました」というエラーが出ることがあります。その場合は次の記事を参考にしてみて下さい。

nn-hokuson.hatenablog.com

Blenderで書き出しUnityにインポートする

Blenderで作ったモデルをUnityにインポートしましょう。メニューから「ファイル」→「エクスポート」→「fbx」を選択します。

f:id:nn_hokuson:20170420194917p:plain:w400

続いて作成したfbxファイルをUnityにドラッグ&ドロップしてインポートします。
インスペクタから「Rig」→「Animation Type」を「Humanoid」に設定して「Apply」ボタンを押してください。

f:id:nn_hokuson:20170420194926g:plain

configureボタンを押して正しくボーンが対応付けられているかを確認します。全身が緑色のおじさんになっていたら成功です。

f:id:nn_hokuson:20170420194952p:plain:w200

緑色のおじさんの右上のタブ「Muscles&Settings」を押すと、正しくボーンが設定されているかをアニメーションとともに確認することができます。

f:id:nn_hokuson:20170420195007g:plain

Animatorでアニメーションを再生する

今回のアニメーションはUnity-chanについてくるアニメーションを利用しましょう。ジャンプや走りなど一通りのアニメーションが揃っているため便利です。ユニティちゃんのアセットはこちらからインポートしてください。
f:id:nn_hokuson:20170420200539j:plain:w500

作成した人形のファイルをシーンビューに配置します。続けて、プロジェクトビューで右クリックし「Create」→「Animator Controller」を選択してManControllerを作成します。作成したAnimator ControllerをAnimatorコンポーネントにセットしてください。

f:id:nn_hokuson:20170420195349j:plain:w550

続いて今作ったAnimatorを編集していきます。ダブルクリックするとAnimatorエディタが開くので、走るアニメーション用に新しいステートを作ります。右クリックで「Create State」→「Empty」を選択してください。

f:id:nn_hokuson:20170420195118p:plain:w350

作成したNew Stateのパラメータをインスペクタから設定します。名前をRunに変更し、Motionの欄は「RUN00_F」を選択します。このRUN00_Fがユニティちゃんのアセットに含まれているアニメーションファイルです。

f:id:nn_hokuson:20170420195127p:plain:w250

再生ボタンを押すと、モデルが走りだしました!

f:id:nn_hokuson:20170420195135g:plain

まとめ

最初は、ものすごく長い工程に感じるかもしれませんが、実際には次の3工程を行っているだけです。

  1. Blenderでボーンを入れる
  2. Unityでボーンを認識させる
  3. Animatorの設定をする

慣れれば簡単なのですぐにできるようになりますよ☆

[asin:B091KQFSRC:detail]