アニメーションをしようよ
はじめに
皆さんこんにちはコーディング課3回生で団体長のko-kiです
アドカレ3日目ですね!
早速ですがUnityのアニメーション使ってますか?
使ってないですよね
少なくとも僕の周り(というか同期)はアニメーション?やってないなぁ、3Dゲームでアニメーション?知らんなぁって人ばかりなので
今回はUnityのアニメーションは結構使いやすいんだぞって記事にしていこうと思います
この記事を読んだらアニメーションをさせたくなるはず!!
ということで早速やっていきましょう!
準備
まずは必要なものを準備しましょう
- Animation Clip(今回はアセットのものを使用)
- Animator Controller
- 動かしたいモデル
Animation Clipはアニメーション自体のデータです。blenderなどからアニメーション付きモデルをインポートするとついてきます。
させたいアニメーションを準備しましょう。
Animator ControllerはUnityのコンポーネントであるAnimatorに設定するものです。アニメーションを付けたいオブジェクトにAnimatorコンポーネントをつけてAnimatorControllerをつけましょう。
AnimatorControllerをダブルクリックでAnimatorウインドウが開いてこのような画面になります。(右側2つはありません)
基本的には一つのブロックが一つのAnimationClipになってます。この一つのブロックを以下ステートといいます。
アニメーションの基本
Animatorの準備ができたらAnimatorウインドウに使いたいAnimationClipをドラッグアンドドロップしましょう。
その後に遷移させたいステート同士を右クリックのmake transitionでできる矢印で結んであげればアニメーションが遷移します!
ちなみにオレンジ色になってるステートはデフォルトとして設定された一番初めに動くアニメーションです。
このままだと勝手にアニメーションを遷移し続けてしまうので遷移に条件を付けましょう。
Animatorウインドウの左側にParametersの欄があると思います。ここに条件に使うパラメータを作っていきます。
右側の+を押すと4つの選択肢がでます。Float,Int,Boolはそのまま値によって遷移の条件を変えられます。
TriggerはTriggerが設定された一回遷移します。これは攻撃アニメーションに遷移したいときに使うことが多いです。
今回は前方向に歩くためのIsForwardというパラメータをBoolで作ります。
そうしたらIdle->WalkForwardの矢印をクリックしてください。Inspectorが画像のような表示になります。このConditionsの+をクリックすると遷移条件を決めることができます。
今回はIsForwardがtrueのときにします。これで自由にアニメーションの遷移が出来るようになりましたね!
あと大事な設定なんですが、HasExitTimeのチェックを外しましょう。ここにチェックが入っているとアニメーションが再生され切ってからしか遷移しなくなります。
攻撃アニメーションとかへの遷移が遅くなるってことですね、、、
それではプログラムからParameterを変更できるようにしていきましょう
Animatorを取得して、SetBool(SetFloat,SetInt,SetTrigger)と記述することでパラメータを変更できます。第一引数にパラメータの名前、第二引数に値を記述しましょう。
Triggerは第二引数はありません。
今回はStart関数に書いてしまってますが必要な場所に記述しましょう。
これで基本的なアニメーションは完璧です。数が少ないシンプルなアニメーション遷移のときはここまでの方法で十分に遊べるゲームになると思います!!!
アニメーションの応用
さてここからは少し応用的なことをやっていきます。ここに書いてあることがマスターできるとアニメーションを増やしすぎて遷移がぐっちゃぐちゃになったAnimatorとおさらばできたり、コンボ攻撃を作れたりしますよ。それではやっていきましょう!
といっても僕自身まだマスターなんて程遠いので勉強したことをつらつら書いてるだけになるかもしれませんが
応用その1:ステートを一つにまとめよう
アニメーションをどんどんAnimatorに放り込んでいると移動に攻撃モーションにやられモーションに、とステートが大量にできて遷移がわけわからんってことになる日がくると思います。
そんな時にはサブステートを使いましょう。Animatorの何もないところで右クリック->Crate-SubStateで作れます。作ったサブステートをダブルクリックでサブステートの中に入れます。
このEntryはサブステートに入る矢印に、Exitはサブステートから出ていく矢印に繋がっているので、この中で必要な遷移をしてあげましょう!
よく使うのは移動関連と攻撃関連になると思います!
これは移動とアイドルモーションを一つのサブステートにしたものです。
見切れてますが左上の緑色がEntryで左下の水色がAnyStateステートです。
AnyStateから繋がっているステートはどの状態からでも遷移することができます。
これを聞くと遷移条件をつけるなら全てAnyStateから繋げばよくない?となりそうですが(なった)、そんな甘くはありません。
どこからでも繋がるということは平気でして欲しい遷移をガン無視で飛ぶことがあります。
実際に使ってみると分かりやすいとは思いますがAnyStateはアイドルモーションに使うのが丸いんじゃないかな
今回は移動モーションを全方向分使ってるのでごちゃごちゃしてますが、一方向だけ準備してモデル自体を回転させる方法をとるならばアニメーションブレンドという方法でさらに滑らかな遷移をさせることができ、さらにAnimatorが見やすくなります。使ってみたい人は各自調べてみてください、意外と情報が出てくるのでここでは省略
こちらは攻撃のアニメーションをまとめたサブステートです。ここからは簡単にコンボ攻撃を作る方法をご紹介
緑のステートから繋がってる灰色のステートが左から攻撃コンボ1,2,3となってます。それぞれの遷移の矢印にはTriggerを一つだけパラメータとして用いています。
Exitに向かう矢印はパラメータの設定をなくし、一定時間以内に入力が無ければTriggerがオンにならずにExitへ遷移という形になっています。
この方法を応用して攻撃アニメーションへの遷移パラメータに攻撃タイプなんかのパラメータを増やすことで派生のあるコンボ攻撃を作ることもできます。
例:パンチ→パンチ→パンチとパンチ→パンチ→キックのように種類を増やすことができる。
コンボの受付時間を長くしたいときは矢印を選択してInspectorから二つのアニメーションの重なっている時間を伸ばしてあげてください。
ここまでできたらサブステート同士を繋いであげましょう!遷移条件に攻撃Triggerを設定するのを忘れずに
応用その2:アニメーションから関数を呼び出そう
どちらかというとこちらの方が1より使いそうな気もしますが、アニメーションから関数を呼び出す方法を紹介します。
アニメーションを再生中にプレイヤーの移動を制限したい、攻撃中だけ当たり判定を付けたい、などアニメーションの再生を取得したい場合が多々あると思います。
さらには攻撃アニメーションによって攻撃力を変えたい、そんなお悩みまで解決できてしまうのがAnimationClipから関数を呼び出す方法です!
まずはアニメーションから呼び出したい関数を作りましょう
今回はあとの説明のために引数も準備しました。
それでは呼び出しに使いたいAnimationClipを選択して右上のEditを押しましょう
そうするとこのような画面になると思います。Eventsのところが開けてない場合は選択して開いてあげてください
次にメモリの左側のAddEventを選択するとイベントが作成されます!そのイベントを関数を呼び出したい時間まで動かしてあげましょう
そしてFunctionに先ほど作った関数の名前を入れてあげると呼び出すことができます!簡単だね!!!
※注意Functionには名前を間違わないように注意していれてください。間違えると呼び出されません。
Functionの下にあるFloat,Int,String,Objectが引数に相当するものです。この種類しか引数に渡せないのは不便に感じることがあるかもしれませんがその時はその時でということにしておきましょう
さて以上で関数を呼び出すこともできるようになりました!これで好きなだけアニメーションを触れますね!!!
コンボ攻撃も作り放題!
さいごに
どうでしたでしょうか?アニメーション辺りは周りの人を見てると億劫になりやすいポイントなんじゃないかと思います。
特に遷移がごちゃごちゃしだしたときには絶望ものだと思います。あまり詳しいところまで書けませんでしたが、今回の記事でアニメーションを触るきっかけになってくれたら嬉しいです。それでは良きアニメーションライフを!!
明日はMt君の音楽理論のすゝめです!お楽しみに!