Unityで3Dモデルをドット絵風に描画したい<3>
tkg-lag.hatenablog.com
まずは前回の成果から
今回からきちんと動画を貼ることにしました、なぜ標準で動画が使えないんだはてなブログ
前回はとりあえず静止画としてはいい感じだけど動かすとちらつくよねってのを直して上の動画みたいな感じになりました。
今回はアニメーションがぬるぬる過ぎてレトロゲーっぽくない!ってとこを直していきます。
・まずはアニメーションをコマ送りに
「Unity コマ抜き」とかで調べるとまず出てくるのは多分3Dアニメ界隈の話です。
3Dでのアニメを手書き作画っぽく見せるためにわざとキャラの動きの目立つところのみを残してコマを抜いていってカクつかせる、って手法をリミテッドアニメーションというらしいです。
そっち方面でのUnity的解決策だとそもそもアニメーション自体を改変したり、アニメーションのコマを残したい部分の秒数を一個一個手打ちして処理するってのが多かったんです、けどそれはちょっとなぁと。
そもそもこのドット絵描画のコンセプトは「ドット絵描くのがめんどくさいから3Dモデルそのままぶち込めばドット絵っぽくなってほしい」っていうのでしたから面倒なのは避けたいです。
もっと言えば3Dアニメのようにきれいになる必要は無いんです。それっぽいだけでいいので。
そこでここでは単純にAmimatorコンポーネントを一定周期でオンオフする手法を取りました。
Amimatorコンポーネントをアニメーションの途中でオフにすると、キャラはオフにされた時点の動きで静止します。
オンに戻すとそのオフにされたところからアニメーションが再開されます。
つまりAmimatorのオンオフを繰り返せばいわゆるコマ送り状態でキャラの動きが描画されます。
ちなみに今回からUnityChanではなくこちらのモデルを利用します。
理由はキャラのディティールが細かくないほうがドット絵向きだから、UnityChanは細かすぎるねん
まだただ描画が遅れてる感じですよね。
そりゃそうです、Animatorをオフにすると動きが一時停止、オンにするとそこから再開されるんですから。
やりたいのは描画速度はそのままでコマが抜かれてるような処理です。
・アニメーションのコマ抜き処理完成へ
じゃあどうすればいいのかといえば、Animatorの再生速度を上げればいいです。
推測ですが、Animatorの再生速度を上げる処理自体がコマ抜きに近い処理がされているのではないかと思います。
つまり速度1のとき1→2→3→4→5→6→…と再生されるところを速度2だと1→3→5→…と処理されるということです。
この再生速度の処理と先ほどのコマ送りを利用すれば1→(一時停止)→2→(一時停止)→3→(一時停止)→…というコマ送り状態から、1→(一時停止)→10→(一時停止)→20→(一時停止)→…という理想のコマ抜きができるはずです!
ということでやってみました。
オンオフの頻度と速度は同じ値にしています、他の値考えるのめんどくさかったので。
どうでしょう、個人的にはまぁ良い感じなんじゃないかと思います。
あと、コマ抜きしてるせいで描画頻度がn秒間隔の時、例えば歩き→歩行のアニメ遷移が最大n秒遅延してしまい、移動キーを入力した瞬間は地面を滑ってるようになってしまいますのでついでにそれも直しています。
すぐ遷移して欲しいアニメーションのリストをインスペクタから作っておいて、前フレームと今のフレームでのアニメ―ションを取得して遷移が発生したときにはカウンタをリセットすることですぐアニメーションが始まるようにしています。
ということで前回と今回の成果をまとめて見てみましょう。
左から、
ただのドット描画→描画位置のドットスナップ→スナップ&アニメーションコマ抜き
となっています。
いい感じじゃないかなぁ???自分で見てるとよくわかんなくなってきました。
あと追加する要素があるとしたら回転のコマ抜きですかね。
スーファミをイメージすると、画面方向に垂直な回転(Unityで言うところのZ軸回転)は有名な「拡大縮小回転」を使ってハードウェア側で処理できるのでドット絵は追加で不要、つまりぬるぬる動いてもらって問題ないんです。
でも画面方向じゃないX軸Y軸回転は「拡大縮小回転」の対象外なので(スーパーFXチップの力でも借りない限り)逐一ドット絵を描いていたはずです。
つまり、その方向の回転についてはコマを抜いてあげたほうがドット絵としてのリアリティが増すんじゃないかなと考えてます。
どう処理するかはまだ思いついてないですけど、ドット座標にスナップしてあげたときと同様に取れる角度を離散化してあげればできるかなとふわっと考えてます。
というわけで多分次回最終回…??(他に何か思いつかない限り)