Unityでリアルタイムで大きさが変わるモザイク。

Unityで同人エロゲーを作ろうと思い立って試行錯誤中なのですが、ブログの更新がおざなりになってしまってるのでその試行錯誤を書いていこうと思います。
あと、3Dエロゲー製作の記事がネットで全く見つからないので、これから3Dエロゲー作ろう!っていう人に役に立てればいいな。
まだUnityに触って1ヶ月ちょいといったところなんですが、割と形になってきてるので初心者でも結構いける!みんな!エロゲー作ろうぜ!(あとは根気があれば完成できるのだけど……自分に1番足りない部分です。)

さて、今回はエロゲー製作に欠かせないモザイクを作っていこうと思います。
※注意 現状同人サイトに1作品もアップロードしていないので、以下の方法で審査通過するか不明です。また、Unity初心者ですので誤り等あるかも知れません。
日本でエロゲーを作るには避けては通れないものですね。せっかくエロゲー作っても販売できないんじゃ意味がないですもん。販売して利益を出して、それを元手に更にエロいゲームを作りたいですもん。


さて、用意しましたのはネオアームストロングサイクロンジェットアームストロング砲です。これがノーモザイクで用意できる限界でしょうか。
いや、そもそもモザイクの存在自体おかしいと思ってますよ。人間に最初からついてるものをあけっぴろげにするだけで違法だなんてまったくおかしな話です。

……話を戻しまして、ではモザイクのマテリアルを用意します。
今回使ったのはImagineVR Pixelation Creatorです。これをモザイクにするオブジェクトに適用します。アームストロング砲ではなく、その周りにオブジェクトを作り、それに適用する感じです。

できました。
ただ、このままではカメラを遠くに移動するとモザイクが小さすぎて、近くだとモザイクが大きすぎます。
カメラの距離で可変するようにしたいんです。

マテリアルにCell Sizeというモザイクの大きさを変える数値があります。これをカメラとモザイクオブジェクトの距離に応じて可変するようにします。



PlayMaker(※プログラム知識が無いので使っています)でこんな感じにしました。
シェーダーのスクリプトのvector4(変数)をPlayMakerでいじる感じです。
ところが可変するようにはなりましたがまだ遠くに移動するとモザイクが小さすぎて、近くだとモザイクが大きすぎます。
この計算方法だと、カメラとモザイクオブジェクトの距離の数値の動きが激しいみたいです。
なので、数値の動きを緩やかにするために安易ですが距離の数値の平方根を求めてそれを計算に加えます。
※追記
平方根の追加ではなくて数値の制限(clamp)するだけで良いかも知れません。

そっちの方が管理しやすいです。



偉い人(?)怒られない程度のいいモザイクになりました。モザイクがある方がなんだか卑猥な感じがしますね。
あとはカメラがオブジェクトに近づきすぎるとモザイクを貫通してしまう為、ある程度近づいたらフェードアウトするようにします。
昔遊んだ3D同人ゲームはこの処理が無くてモザイクの向こう側に行けたんですよね。丸見えになりました。肝心な部分をあまり作り込んでいなかったんでセーフだったのかもしれませんが……

今回はカメラとオブジェクト間の距離で計算していますが、オブジェクトの中心点で計算するため大きいオブジェクトだと端が上手く適用できません。あと、複数モザイクが必要な時はめんどくさいのでそんな時は当たり判定をつけてフェードするようにすればいいと思います。