どうも、ラブヘイトです
今回はBlenderで複数オブジェクトのアニメーションを作成してUnityで動かしていこうと思います
題材はサバイバルゲームとかでよくある、焚き火を作成していきます!
え?なんとなくですよ笑
バラバラの素材が集まって焚き火ができていくようなアニメーションなので
他にも応用できるかと思います
◆木材作成
モデルに関しては全てblenderで作成しています。
この方の記事を参考にTexturehevenからダウンロードできるTexture設定を行いました。Texturehevenには加工済み木材はなかったので適当な木材のタイルをダウンロードしました。
参考
Blender テクスチャを利用したリアルなマテリアルの作り方【PBR】 - TomoGのごちゃまぜ倉庫
ちなみにこの木材のShader Editorはこんな感じ
◆石作成
石はこの方の記事を参考
Blenderで石を作るチュートリアルを試す(1) | ぬの部屋(仮)
Blenderは初心者すぎるので、自分が工夫して調節っていうのはもう少し先になるかと思います。
Unityにモデルを持ってくるときは、ベイクを行ってレンダリング結果を直接Textureに焼き込みました
◆Textureのベイク方法
参考:
Blender レンダリング結果をテクスチャにするベイク - TomoGのごちゃまぜ倉庫
すごくお世話になってる...
普通にベイクすると大体暗いTextureになってしまうので、
Lightをモデル全体に均一に当たるように配置してからベイクを行いました
◆アニメーション作成
Unityでアニメーションを作成しようと思っていたのですが、
UnityはBlenderほどオブジェクトをグリグリ動かせないのでBlederで作成することに
今回は散らばっているところから集まって焚き火が完成するようなアニメーションにしたかったので、コツはずばり「適当さ」です(どやっ!)
File > Append から 木材と石を持ってくる
そうしたらまず組み合わせて完成形を作成
ドープシートを開いてフレームの最後の部分を選択し、完成した焚き火のキーフレームを挿入(オブジェクト全選択> 「Iキー」 > LocRot )
今回スケールは変えないのでpositionとrotationだけをキーフレームに登録しました(重くなるからね)
次に1フレームに移動したら
あとは適当に散らばせるだけ!!笑。そしてキーフレームを登録
上から作業するのがおすすめ(7キー)
とはいっても最初と最後を登録しただけでは直線的な動きになってしまうので、
中間で少し浮かせたり、回転を加えてたり、スタートずらしたりと
引き寄せられてる感じを表現しました
グラフエエディターとかも使ってみたかったんだけど、この有様だったのでやめました笑
◆Unity用にエクスポート
ここをうまく設定するのに結構時間がかかりました
ボーンのアニメーションを出力するわけではないので、取り扱いが違います
fbxとして出力するのは1フレーム目のバラバラの状態で出力します(後で説明)
注目すべきはAnimationの設定
色々試した結果Baked Animationは必須。これにチェック入れていないとそもそもアニメーションが出力されない
最初は全てチェックされているのでこれらのチェックを外してください
・ Key All Bones
・ NLA Strips
・ All Action
※これらを外さなかったら、アニメーションがたすき掛けのように大量に出力されてしまいます。扱えたものではありません(私のunityでは重すぎて死にました)
チェックを外したら、出力!
Unityにインポートしたらこんな感じです
きちんとアニメーションがひとつになっていますね
配置してアニメーションを再生
◆パーティクル
パーティクルで炎を作成します
静止画だと炎なのに角ばってますね笑
Textureを使うのですが、いい感じのCloud Textureがなかったので「ibispaint」というアプリで適当に作成しました。どうぞご自由に使ってください
設定
Render Materialに設定するマテリアルですが、Create > Materialで新規マテリアルを作成して、shaderをMobile > Particle >Additive にします
◆Haloを追加
完成しました!がもっと空間的に明かりが欲しいので
Haloコンポーネントを追加
どっちがいいんだろ...
◆組み合わせる
Blenderからエクスポートしたアニメーションは編集ができないので、
スクリプトでアニメーションと炎パーティクルを組み合わせていきます
先ほどのhaloとパーティクルをあらかじめ追加しておきます(setActive=false)
次に焚き火にスクリプトを追加します
gist99074be1c0823b06ddbf60aac06a6e7f
nomalizedTimeでアニメーションが終わったことを取得してます
Animator
時間がかかりましたがなんとか完成しました!
思ったよりうまく作れて嬉しいです!