スポンサーリンク

Unity実習17、アニメーションをつけてみよう

今回は、Unityにある"Mecanim"なるものを使って、キャラにアニメーションを設定していきます
アニメーション自体はUnityでは作れません、残念

Mecanimって何だよ
これ、メカニムって読みます
Unity4から追加されたものだそうで、
アニメーションリーターゲット:同じアニメーションデータを色んなキャラに使いまわせる(人型限定)
ステートマシン:アニメーションの遷移を簡単に設定できる
なんて機能があるそうです
とりあえず、やっていきましょう

ProjectビューからAssets/3D Assets/Player/にあるPlayerのモデルデータを選択します
SnapCrab_NoName_2016-5-31_11-31-36_No-00.jpg

Inspectorで Rig タブを選択
AnimationTypeを Humanoid (人型)にします
そうしたら Apply を選択、Configure...の左にチェックマークが付けばOK
SnapCrab_NoName_2016-5-31_11-32-19_No-00.jpg

Humanoid以外の項目はどんなものかと言うと
None: アニメーションなし
Generic: 人型以外
Legacy: Unity3以前のアニメーションデータとの互換用
基本的にLegacy以外を使えば良さそうですね

アニメーションデータの設定
サンプルデータにはプレイヤー用に「待機」「移動」「攻撃」「倒れる」の4つが用意されています
先ほどのフォルダーに Player@Stay というアニメーションデータがあるので選択
SnapCrab_NoName_2016-5-31_11-44-31_No-00.jpg

InspectorでRigタブを開き、AnimationTypeをHumanoidにして、Applyを押します
残りの3つ(Player@Down, Player@Run, Player@Attak)にも同じ作業を施します
SnapCrab_NoName_2016-5-31_11-44-51_No-00.jpg

次に、Projectビューでアニメーションデータ、どれか1つを選択して、Inspectorで Animations タブを選択します
すると、Unityのアニメーションデータ形式であるAnimation Clipの設定画面が表示されます
アニメーションデータをUnityで使うには、インポートしたデータから必要な分だけを切り取り、Animations Clipファイルにする必要があるそうです
動画編集で余計な場面をカットして、素材用に軽い形式に変換するようなもの?
他にも色々機能があるようなので引用して説明

・LoopTime: アニメーションがループ再生するようになる
・LoopPose: アニメーションの最初と終わりの繋が自然になる
・Root Transform Rotation
  ・Bake Into Pose: 有効にすると、ルートオブジェクトのTransform→Rotationにアニメーションの値が代入されなくなる
  ・Based Upon: 回転のルート位置を設定できる
    ・Original: アニメーションのデータの通り
    ・Body Orientation: 上半身の前方をルートのTransform→Rotationに合わせる
    ・Offset: 回転の補正値を設定
・Root Transform Position(Y):
  ・Bake Into Pose: 有効にするとオブジェクトのPosition Yにアニメーションの値が代入されなくなる
  ・Based Upon: 垂直方向の基準を設定
    ・Original: アニメーションのデータの通り
    ・Center of Mass: オブジェクトの重心をPotition Yに合わせる
    ・Feet: 足の位置で合わせる
    ・Offset: Potition Yの補正値を設定
・Root Transform Position(XZ)
  ・Root Transform Position(Y)の(XZ)版
  ・Based Uponは水平方向の基準を設定
・loop match: アニメーションの最初と最後を繋げた時に、どれくらい自然かを示している、緑→黄色→赤と変化し、赤に行く程ループが不自然
・Mirror: アニメーションの左右を反転させる

SnapCrab_NoName_2016-5-31_11-50-22_No-00.jpg
設定した後は Apply でしっかり適用しましょう
設定をしていて、どんなふうに再生されるかは、下にある Preveiw で確認できます
右上のスライダーで再生速度を変更可能

早速設定していきましょう
Stay と Run には
次のように設定
SnapCrab_NoName_2016-5-31_12-18-23_No-00.jpg

Attack はこう
SnapCrab_NoName_2016-5-31_12-20-5_No-00.jpg

Down はこう、一箇所Offsetの値を変えます
SnapCrab_NoName_2016-5-31_12-20-59_No-00.jpg

アニメーションイベントの設定
アニメーションをどのタイミングから再生するか~を設定します
Attack の Animation タブの下、Applyの近くに Events があるので開きます
SnapCrab_NoName_2016-5-31_12-32-46_No-00.jpg

Eventsの文字の下にある四角(Add Event)を押すと Edit Animation Event のウィンドウが開くので
Function の欄に AtartAttackHit と記入
Eventsのスタイダーを 0:20(029.0%) 前後にする
先にプレビューの赤いスタイダーで位置を決めてから、Add Eventを押すといいかも?
SnapCrab_NoName_2016-5-31_12-42-29_No-00.jpg

設定したら一旦ウィンドウは閉じて、赤いスライダーを 0:27(040.0%) 前後に移動させ
Add Eventを押す、スライダーを合わせ、Functionに EndAttackHit と記入
ウィンドウを閉じる
SnapCrab_NoName_2016-5-31_12-43-44_No-00.jpg


同じようにして、1:06(095.0%) 前後に合わせ
Functionは EndAttack と記入
SnapCrab_NoName_2016-5-31_12-45-4_No-00.jpg

Applyを押して適用します

アニメーション遷移を設定する準備
ここで、どのアニメーションからどのアニメーションに繋げるか、どんな条件で再生するかを設定します
ProjectビューのAssets/内にフォルダーを作成、名前を Animations にします
SnapCrab_NoName_2016-5-31_12-59-7_No-00.jpg

作ったフォルダーを開いた状態で
Projectビューから Create > Animator Controller を選択します
作成されたら、名前を PlayerAnimatorController に変更
SnapCrab_NoName_2016-5-31_13-1-48_No-00.jpg

ダブルクリックして、Animatorビューを表示します
SnapCrab_NoName_2016-5-31_13-4-46_No-00.jpg

本だと Any State だけ表示されている、と書いてありますが
こっちには Entry と Exit がありますね...これもバージョンが違うからでしょうか

アニメーションステートの作成
そりゃ一体何だ、って話ですが
「アニメーションの再生状態を表す要素」だそうです
ゲーム実行中にこれを切り替えることで、設定されたAnimation Clipが再生されるようになると

やれば分かるだろう、ということで
Projectビューにある、Playerの Stay のアニメーションをAnimatorにドラッグ&ドロップ

※06/01追記※
このStayのアニメーションのさらに子階層
その中にあるmモーションデータをドラッグ&ドロップしてください!
そのままでも出来なくはないけど、本の通りの方が確実です

SnapCrab_NoName_2016-6-1_17-43-51_No-00.jpg
SnapCrab_NoName_2016-5-31_13-13-18_No-00.jpg

他の3つも同様に放り込みます
SnapCrab_NoName_2016-5-31_13-16-59_No-00.jpg

Any State は、全ステートに同じ遷移先を指定するためのステートで、どのAnimatorControllerにもいるそうです

オレンジ色のステートは、デフォルトステートと言って、一番最初に再生されるアニメーションステートになります
今回は Stay がオレンジになっていればOK
もし違うものがオレンジになっている場合は、Stayの上で右クリック Set as Layer Default State を選びます

ステートを選んだ状態だと、Inspectorで再生するアニメーションであったり、再生速度、左右反転などの設定ができます
SnapCrab_NoName_2016-5-31_13-23-30_No-00.jpg

アニメーションの遷移のパラメータを作成
どういう時にアニメーションを切り替えるかを設定します
Animatorの左側に Parameters という項目があるのでクリック
SnapCrab_NoName_2016-5-31_13-27-4_No-00.jpg

右の + でパラメータの種類を選択した後、追加できます
今回追加するのは3つ
Speed: float値で移動速度を表す
Attacking: bool型で攻撃中かどうかを表す
Down: Trigger型で倒れている最中か表す

それぞれ
Float型で追加し、名前をSpeed
Bool型で追加し、名前をAttacking
Trigger型で追加し、名前をDown
間違えて置いた場合は右クリックからDeleteを選択
SnapCrab_NoName_2016-5-31_13-30-11_No-00.jpg

アニメーションステート間の遷移と遷移条件の作成
アニメーションステート間の遷移は矢印で表されています
ステートとステートを結ぶ線に、△がどちらかに向かっているはずです
これを Transition(トランジション)と言います

Transitionの作成はまず、伸ばす元のステートを右クリック > Make Transition を選択します
その後、繋げたい先のステートを左クリックすれば接続完了
最初に Any State から Down に向かって伸ばしてみてください
SnapCrab_NoName_2016-5-31_13-42-0_No-00.jpg

伸ばしたら、Transitionをクリック(青くします)
Inspectorに色々とパラメータが表示されます
SnapCrab_NoName_2016-5-31_13-42-11_No-00.jpg

その下の方にある Conditions を編集します
最初は List is Empty とか書いてあると思うので(上のサムネでは押しちゃったので違うのが出てます)
右下の+を押して項目を追加
最初はSpeedとなっている場所を Down に変更します
これでまず1つ終わり
SnapCrab_NoName_2016-5-31_13-50-50_No-00.jpg

次からは、同じ要領で他のものをつなげていきます

Stay→Run
Speed : Greather(以上の場合という意味) : 0.5
SnapCrab_NoName_2016-5-31_15-21-48_No-00.jpg

Run→Stay
Speed : Less(以下の場合という意味) : 0.5
SnapCrab_NoName_2016-5-31_15-22-13_No-00.jpg

Stay→Attack
Attacking : ture
SnapCrab_NoName_2016-5-31_15-22-28_No-00.jpg

Run→Attack
Attacking : ture
SnapCrab_NoName_2016-5-31_15-22-38_No-00.jpg

Attack→Stay
Settingsを開き、ExitTime: 0.79
SnapCrab_NoName_2016-5-31_15-23-7_No-00.jpg

このExit Timeを探すのに本当に苦労した
本では「Parametersメニューにパラメータが1つも作成されてない場合でも、Exit Timeパラメータは必ず存在します。」
なんて書いてあって、Conditionsのところのスクショがあるのですが

いや、そんなもんねぇし

何度読み返してもない、Unityのサポートとか色々なサイトを見て回って、あるにはあるんだけど
どこにある?どうやって追加する?といったことが一切書かれておらず
一時間くらいあれこれしてて、Settingsの中にいやがった!
というわけです
多分これでいいはず

アニメーションの遷移を確認
やっとキャラクターが動きます
ProjectビューでPrefabの中にあるPlayerプレハブを選択
InspectorでAnimatorの項目を設定します

ControllerにPlayerAnimatorControllerを設定
右の⦿印をクリックするとウィンドウが出ます、そこに真っ先に出ると思うのでダブルクリック
ApplyRootMotionのチェックを外します
外れている場合はそのままで
SnapCrab_NoName_2016-5-31_15-0-47_No-00.jpg

見やすいようにGameビューとAnimatorビューが並ぶようにレイアウトを動かしましょう
どちらかのタブの部分をドラッグすれば好きな場所に移動できます
テストプレイが始まると、Animatorのステートに青いゲージが出ます、これが今再生してるアニメーションはどれで、どのくらい再生したかを表してます
Parametersの Attacking にチェックを入れてみてください
プレイヤーが攻撃します、ちゃんと動いていれば成功
SnapCrab_NoName_2016-5-31_15-32-43_No-00.jpg

現時点では、プレイヤーキャラはまだ移動するとStayのままスーッと移動します
これからその処理をします
それと、エラーも出ていたりしますが
これは今は無視していればいいそうです

ゲーム実行中にスクリプトでAnimatorControllerを制御
UNIDRA_DATA/Data/MainGame/Scripts/Chapter9 にある CharaAnimation.cs を
Projectビューの Assets/Scripts の中にインポート
SnapCrab_Chapter9_2016-5-31_15-49-54_No-00.png

SnapCrab_NoName_2016-5-31_15-50-20_No-00.jpg

中身は、それっぽいこと書いてます
ProjectビューからAssets/Prefabs/Playerを選択
Inspectorビューに先ほどのCharaAnimationスクリプトを取り付けます
SnapCrab_NoName_2016-5-31_15-54-46_No-00.jpg

これで移動やダウン時のアニメーションが適用されました!
が、ちょっと変です
1つ上げるなら、Stayのモーションが終わりきっていない状態で走りだすと、最初Stayのまま動いて、再生が終わると、Runに切り替わって走りだす
そんな感じです
ここの直し方は、上で書いたExitTimeを探している時に見つけたので書いておきます

AnimatorのTransitionをクリックして、Inspectorを見ると、Has Exit Time という項目があります
ここのチェックを外すと、アニメーションが再生している最中でも次のアニメーションに移れるようになります
逆に、ここにチェックを入れておけば、アニメーションの再生が終わるまで次の動作に移れないようにも出来ます
SnapCrab_NoName_2016-5-31_16-6-55_No-00.jpg

画像を沢山貼ったせいか、ちょっとブログが重い...!
キリもいいので、今回はこのあたりで〆ておきます
次は敵にアニメーションを設定していきます
関連記事

Leave a Reply


管理者にだけ表示を許可する

Comment

  • 2016/10/19 (Wed) 23:16
    KataP / URL
    感謝

    Has Exit Time の理解ができなくてどんづまりになっていましたが解決しました
    ありがとうございました太字の文

  • 2016/10/20 (Thu) 12:11
    NF / URL
    No title

    KataP >>
    お役に立てて何よりです!

Leave a Reply


管理者にだけ表示を許可する