読者です 読者をやめる 読者になる 読者になる

しゅみぷろ

プログラミングとか

UnityTexturePaintで出来ること

Unity UnityTexturePaint Shader Graphics

はじめに

esprog.hatenablog.com

上記記事でTexturePaintを公開しました。 公開当初より出来ることが多くなってきたためメモがてら機能を整理しておくのが今回のエントリです。

TexturePaintを使ってみたい場合は、GitHubから落としてきてUnityで開いてみて下さい。 サンプルのシーンがいくつか入っているので、適当にシーンの構造とか見てもらえれば使い方がわかると思います。

Packageも配布しているので、以下のURLからDLしてUnityで開いても大丈夫です。

https://github.com/EsProgram/UnityTexturePaint/raw/master/UnityTexturePaint.unitypackage

どんなことが出来るか

f:id:es_program:20160501142352g:plain:w400

エフェクトはAsset Storeからお借りしました

普通にペイントしてみた例です。

f:id:es_program:20161014003435g:plain:w400

モデルはAsset Storeからお借りしました

キャラクターモデルにペイントしてみました。

f:id:es_program:20161014003516g:plain:w400 床に転がった球やらの軌跡にペイントしています。

f:id:es_program:20161008220700g:plain:w400 適当にですが、液体がダラーっと垂れるようなアレをやろうとしたやつです。

塗り機能

f:id:es_program:20161006235916p:plain:w500

TexturePaintというくらいなので、当然塗れます。

塗り方ですが

  • 塗りたいオブジェクトにDynamicCanvasスクリプトをつける

f:id:es_program:20161014002927p:plain:w500

上記画像は新しく作成したシーンでPanelを配置し、そのPanelにDynamicCanvasを付けたところです。 DynamicCanvasを付けると、現在オブジェクトに付けられているMaterialの数だけ項目が表示されます。

f:id:es_program:20161014003401p:plain:w500

Unity標準のシェーダーを利用している場合は、これらの項目の編集は不要です。 シェーダーを独自で書いている場合、_MainTexにはアルベトを計算するテクスチャのプロパティ名を、_BumpMapにはバンプマップを利用している場合にバンプマップテクスチャのプロパティ名を指定します。 大抵の場合は編集不要な項目ですが、外部で作られたシェーダーを使っている場合は注意して下さい。 もし存在しないプロパティ名を指定した場合はエラーログが出ます。

Use BumpMap Paintは、後述するバンプマップペイントを利用する場合にチェックします。

f:id:es_program:20161014010503p:plain:w500

上記画像の例では、先程_MainTexと書かれていた場所を_Testと書き換えて実行した例です。

外部のスクリプトから塗りたいオブジェクトを取得し、GetComponent().Paint()メソッドを呼び出すことでペイントが出来ます。 Paintメソッドには色々なオーバーライドがあり、ペイントの際のパフォーマンスを木にされる方のために他のペイント用メソッドも用意されています。

f:id:es_program:20161014011358p:plain:w500

上記の画像では、メインカメラにTexturePaintに同梱されているMousePainterを追加し、インスペクターで値を弄った例です。 MousePainterは、クリック位置にDynamicCanvasを設定したオブジェクトがあった場合にペイントを行うスクリプトです。 ブラシの画像や色、大きさ等、様々な項目があり、これらをお好みで設定出来ます。

設定後、実行するとペイントを行うことが出来ます。

バンプマップペイント

バンプマップが設定されているオブジェクトに対しては、バンプマップペイントを行うことが出来ます。

f:id:es_program:20161008164106g:plain:w300

設定方法は

  • 塗りたいオブジェクトにバンプマップが設定されているかを確認する

f:id:es_program:20161014013302p:plain:w500

塗りたいオブジェクトに付けられているDynamicCanvasのUse BumpMap Paintにチェックを入れます。 また、塗りたいオブジェクトに設定しているマテリアルのNormal Mapの部分に法線マップテクスチャを指定しています。

  • ペイントするブラシでバンプマップペイント用項目を編集する

f:id:es_program:20161014013728p:plain:w500

ペイントする際に使うブラシの設定で、Blush Bump TextureとBlush Bump Blendを設定します。

これでバンプマップペイントの設定は完了です。うまく使うことでかなり面白い表現が可能です。

f:id:es_program:20161008165342p:plain:w400

おおまかな当たり判定でペイントを行う

通常、TexturePaintを行うには塗りたいオブジェクトにMeshColliderを付ける必要があります。 これは、ペイントする場所の当たり判定を行う際に、メッシュの表面位置が必要になるためです。

しかし、キャラクターや生物など、複雑な形状をしたモデルの場合、MeshColliderで当たり判定を行うとかなり処理が重くなります。 そこで、UnityTexturePaintでは、MeshCollider以外のコライダーでも動作するPaintNearestTriangleSurfaceというメソッドを用意しています。

これを利用すると、Capsule Colliderなどでおおまかな当たり判定を取っているようなオブジェクトにも塗りを行うことが出来ます。

f:id:es_program:20161014195032g:plain:w500

上記画像で、透明な赤いCubeで当たり判定を取っています(BoxCollider)。なのでPaintNearestTriangleSurfaceメソッドのパラメータに与える点はBoxCollider上の点なのですが、中のSphereのそれっぽい位置にペイントされています。

PaintNearestTriangleSurfaceメソッドでは、メッシュが複雑であるほど精度が高くなります。逆に、メッシュが単純なものだと精度が悪くなり、意図しない位置にペイントされたりします。 PaintNearestTriangleSurfaceメソッドは、複雑なオブジェクト向きの機能といえます。