【Unity】3Dゲームを作る その5 ユニティちゃんにモーションを追加 (その7で修正)
注:今回の記事は長いです。
こんばんは、制作過程全部載せるか一部にするか考え中のzankです。
土日でけっこう進めれると思ったらリアルが忙しくてほとんど進歩ゼロでビビってます。
今回はユニティちゃんにモーションをつけていきたいと思います。
さすがに何回も前のパート見ろはしつこいと自分でも思いますが、いきなりこれ見た人のために案内しときます。
さて、本題に入っていきましょう。
その3では簡単にユニティちゃんに動きをつけましたが、本来動きをつけるためには、アニメーションを作らなければなりません。
なのでまずはアニメーションについての説明をしていきます。
その前に言っておかなければいけないことがあります。
それは、
私は今までアニメーションを使ったことがありません!
今までは偉そうに解説していましたがそれは基本的なことだからであり、前に音ゲーを作った時にunityを使っていたためできていました。
しかし音ゲーではアニメーションは一切使っていなかったため、
アニメーションの知識が一切ありません。
なので自分でもたぶんこうなのだろうという形で説明させていただきます。
(間違ってたら申し訳ございません)
というわけで、試行錯誤しながらやっていきます。
まずアニメーションを作るといってもユニティちゃんの場合、すでにモーションが用意されているため、今回はそれを用います。
(何時か分からないですけどモーションの自作もやると思います)
すでにモーションが用意してあるなら、本来ならAnimator Controllerを使って一から設定していきます。
ですが私の場合はすでにその3で動きのモーションが使えるようになる物を入れました。
Locomotionです。
Locomotionではすでに走る用にAnimator Controllerが設定されています。
つまり人の動作に関しては1から作らなくてもこれに追加していくだけで、大丈夫だと思います。
なので今回はこれをいじっていきましょう。
まず、Locomotionをダブルクリックして開きます。
するとこんな画面が表示されると思います
(もしもAnimatorビューが小さかった場合Animatorと書かれたところをドラッグしてもらうと、別のウィンドウで表示できますので、そこで大きさの調整を行ってください。)
この画面が表示されたら真ん中のLocomotionをダブルクリックしてもらうとこのような画面が表示されます。
基本的にここをいじっていきます。
まず何もないところで右クリックしてCreate Stateにカーソルを合わせてもらうと、Emptyというのがあるためそれをクリックします。
そこでNew Stateと書かれた長方形が出てきますのでクリックしてもらい、Inspectorで名前をRunJumpと変えます。
また、この時点ですでにモーションは決まっているためMotionもJUMP00に選択しておきます。
次にWalkRanを右クリックしてMake Transitionというのを選択します。
すると矢印が出てきますので、RunJumpにカーソルを合わせてクリックします。
同様にRunJumpもWalkRunにつなげます。
するとこのようになります。
次にモーションの切り替わりの設定をしていきます。
今回ジャンプはスペースキーを入力するとジャンプするというものを作りたいため、
キーを押したのかそれとも押してないのかの2パターンしかないはずです。
なので使うのはbool型で大丈夫だと思います。
どの型を使うか決まったところで設定に入りましょう。
まず、左上のParametersというのをクリックしてもらい、検索バーの横に+があるのでそこをクリックし、Boolというのを選択します。
そしてでてきたものにIs_Jumpと名前を付けます。
今まで言ってませんでしたが、こういった名前は基本的にわかりやすいものをつけるといいです。
次にWalkRunからRunJumpに向けての矢印をクリックしてInspectorの一番下のConditionsの+をクリックしてもらいIs_Jumpに変更します。
逆方向の矢印も同様にし、trueの値をfalseに変更します。
修正:ここでRunJumpからWalkRunへの矢印ではConditionsは設定しなくてもよい
次にWalkRunをクリックしてもらいInspectorのAdd Behaviourをクリックしてもらうと、New Scriptしかないのでそれをクリックしてもらい、名前をJumpScriptにします。
ここからスクリプトの説明になります。
しかしこちらもあらかじめ注意があります。
それは、
プログラミングを一から教えることはしません。
もしもプログラムまで教え始めたら、しばらくずっと記事がプログラミングの講習になってしまいます。
なのでこの記事ではコメントを多用するのでそれで頑張って理解してください。
地の文でも難しいところなどは説明していきます。
というわけで注意も終わったので続きをやっていきます。
まずスクリプト(マテリアルやプレハブなど)は基本一か所のファイルでまとめておくのが普通です。
なので先ほど作ったスクリプトを空のファイルにScriptと名付けて放り込みます。
(新規作成したスクリプトが見つからない場合は基本Assetsをクリックすると見つかります)
次にJumpScriptをダブルクリックします。
するとこんな画面が出てきます。
初見本気でこれの意味が分かりませんでした。
今まで私が使っていたスクリプトの形式はこのような感じだったのに全然違うものになっていて、初めはバージョン変わってこんな風になったと勘違いしてました。
今回使う上の図のスクリプトはAnimator用のスクリプトらしいです。
このことに気付くまでに3時間ぐらいかかりました。(本気で頭悪い)
ちなみにその間ずっと下の形式で動かそうとしてエラーを吐き続けてました。
(GetComponentがないといわれてunityバグったと思い、見当違いなことをずっと調べてました。)
しばらくしてとりあえず英文訳してみてようやく気付くという。
英語アレルギーなのはだめだということを実感させられました。
割と真面目に先入観というのはマジで厄介なものなので基本的に変なことがあったら自分を疑った方がいいと思います。
本題に戻りまして個々のコメントに書いてあることは簡単に言うと
- OnStateEnter ステートに入った時(動作開始時)に呼ばれる関数
- OnStateUpdate 毎フレーム(ほぼ常に)呼ばれる関数
- OnStateExit ステートから抜け出す時(動作終了時)に呼ばれる関数
- OnStateMove オブジェクトの座標移動をするものを呼び出す関数
- OnStateIK IKを使うときに使う関数
多分こんな感じだと思います。
なので今回はいつでもジャンプできるようにしたいためOnStateUpdateを使っていきましょう。
とりあえずbool判定するための関数をリファレンスで探してみるとSetboolというのがあったのでこれを使います。
するとこんな感じのプログラムができます。
正直今回の場合publicは使わなくてもいいと思いますが一応後々使うかもしれないので書きました。
これを保存してunityに戻りましょう。
戻ってAnimatorビューのWalkaRunを選択し、Keycode とParametersをSpaceとIs_Jumpに設定します
次にRunJumpにもJumpScriptを適応し同様の設定していきます。
ちゃんと動きましたが少しジャンプしたときに横の動きが止まってしまっています。
できれば走った時の勢いのままジャンプしてほしいです。
ここでそれらの調整を行っていきましょう。
まず初めになぜこのように横の移動がなくなってその場でジャンプしているのだろうか。
まず考えつくのがスペースを押したらその場でジャンプの動作になってしまっているということです。
つまり走る動作が完全になくなってしまっているということです。
走る動作に横の移動のパラメータが存在し、ジャンプには上への動作しかないので走る動作がなくなると横へは移動しなくなっていくと推測できます。
では走る動作が続くように設定していきましょう。
再びAnimatorビューに戻りWalkRunからRunJumpへの矢印を選択しInspectorのSettings鵜を操作していきます。
ここの画面の説明は自分でもあまりよくわかってないのであいまいになってしまいますが、モーションの切り替えがどのように行われるかを示しています。なので自然な感じになるようにする場合はここをいじればよいということです。
その前にWalkRunからの矢印のHas Exit Timeを外しておきましょう。
これは前のモーションが最後まで終わってから次のモーションへ行きたいときにチェックするところです。
なのでRunJumpからの矢印の方外しません。
さてここをいじっていきましょう!、と言いたいところですが、やってみたところうまくいきませんでした。
なんでなんでしょう。
色々考えてわからなかったので、もうこうなったときはスクリプトに書いて無理やり動かしちゃえ、ということでJumpScriptで動かそうとしました。
しかしそれでもだめ。
頭悪いから全然わからん。
なので、最終手段の直接ユニティちゃんに移動するスクリプトをつけて動かします。
まずunitychanを選択して、Add ComponentからNew Scriptを選択して名前をmoveにします。
そしてそのmoveのプログラムを開き移動のためのプログラムを入力していきます。
実際に書いてみたプログラムがこちら
(はてなブログでプログラムの埋め込みってどうやるんだろう??)
次にAnimatorのApply Root Motionのチェックを外します。
これでさすがにちゃんと動くはずです。(というか動いてくれ)
それでは実際に動かしてみましょう。
ちゃんと動きました。
これでようやく本当にモーション追加できました。
本気でつらかった。
まさかモーションの追加だけでこんなに時間かかるとはみじんも思ってませんでした。
正直11日投稿無理じゃないかと本気であきらめかけてました。
今回の記事を読んでもらえば分かったと思いますが、基本的に自分が考えたまま書いているため、
失敗なども思いっきり載せていきます。
ただ失敗はこういうことをしようとして無理でしたで終わります。
どのようにして失敗したかを書いていたらさすがに長くなりすぎるし、見れる側もいらないと思いますので。
つまりはこんな感じでゲームを作るときは悩んで作ってますよ、いうことをわかってもらいたいというだけです。
あと、なぜユニティちゃんにスクリプトつけるのが最終手段だったかというと、すでに移動用のプログラムがあるためエラーが起きると思っていたので、できる限りアニメーター内で済ませたかったというのが理由です。
まだ修正すべき点は残っていますが(動作の開始時滑るように動いている点など)、今回時はこれで終わりにさせていただきます。
次回はステージを作っていきたいと考えています。
ようやくゲームらしくなっていきますので、よかったら次回も見ていってください。
今回は非常に長くなってしまい申し訳ございません。
もしかしたらこれぐらいがデフォルトになってしまうかもしれませんがご了承ください。
それではまた次の記事でお会いしましょう。
モーション修正