情報学的バナナの皮

だらだらと自作プログラムについての備忘録

Unityで3Dモデルをドット絵風に描画したい<2>

tkg-lag.hatenablog.com前回の続きから

 

とりあえずここまでの結果がこれ

f:id:tkg_lag:20210328155642p:plain

いい風に見えるよね

見えるでしょ

でも動きで見ると変なんですよね

f:id:tkg_lag:20210328164403g:plain

わかりますかこのガビガビ感というかゆらゆら感

とても一枚絵な感じがしませんよね、これじゃだめなのだ。

・一枚絵っぽくするためのチラ付き防止

なぜガビガビになっているかというと描画はドット単位なのにオブジェクトの座標は小数点までなめらかに動いちゃうから、ドットとドットの間でゆらゆらしちゃうんですね。

つまるところオブジェクトの座標をドットごとにスナップしてあげればいいんです。

 

ドットごとにスナップするためには画面内のドット数と実際の画面の画素数の割合を出してあげて…うーん…と一週間くらい苦戦したんですけどもっと簡潔にやる方法がありました。

 PixelPerfectCameraスプリクト内のRoundToPixelメソッドです。

これは引数にワールド座標を入れてあげると一番近いドットの座標を返してくれる、まさにこの作業にうってつけの関数。ありがたく使わせてもらいましょう。

ということでこのチラ付き処理に必要なのはたったの一行。

transform.position = pixel_camera.RoundToPixel(transform.position);

pixel_cameraはカメラのPixelPerfectCameraをgetcomponentして代入しておきましょう、これで終わりです。

これを物理処理やらなんやらが終わった後に処理されるLateUpdate内で実行してあげればオブジェクトの座標がドットにスナップされて綺麗に表示されます。

結果がこれです。

f:id:tkg_lag:20210328164628g:plain

どうでしょう、一枚絵のスプライトっぽく見えますかね。

あとはこのコードをそれぞれのオブジェクトにアタッチしてあげればOKです。

オブジェクトをカメラに追従したいときとかはカメラ側にもアタッチしてあげると綺麗に表示されるのでチラ付き問題はこれで解決です。

f:id:tkg_lag:20210328170911g:plain

スクリプトのオンオフでチラ付きが改善されるのわかりますかね?

とりあえず今回はここまで。今はコマ落ち処理をどうやろうか悩み中です。