カラーパレットを使ったSprite

f:id:kurihara-n:20160926233843g:plain

スプライトを用いたアイテムやキャラクターなど、
パレットを変えるだけで色替え出来れば、
カラーバリエーション分のカラーテクスチャを持つより、
容量節約できていいよねってことで
試してみた実装。
(ただし、ちょっと筋が悪いって思っている方法)

GitHub - kuriharaan/ColorPalette: Color palette experiment for sprites

やり方
パレットを作りたいテクスチャを選択し、
エディタスクリプトを実行すると、
テクスチャの各ピクセルを順に調べ、
カラーのリストを作り、
新しくソーステクスチャと同じサイズのアルファテクスチャ(Alpha8)を作って、
インデクスを格納していく。

描画には、アルファテクスチャをスプライトとして設定し、
パレットを参照するためのシェーダを持ったマテリアルを割り当てる。

Unity5.4からシェーダの配列パラメータの設定がスクリプトで出来るようになったらしい。
Unity - Scripting API: Material.SetColorArray
など。
スクリプトでは、このSetColorArrayを使ってテーブルを設定するようにしている。

シェーダではテクスチャのPixelからアルファ値をとり、
color 配列のインデクスとして使用するようにしている。

一応、これで望む挙動はしているが、
いくらか微妙な点がある。

・カラー情報を別途シリアライズしないといけない(今は初期値を決めうち)
・エディタでプレビューできない

逆に、よいところはスクリプトからカラーを設定すれば、
なんでもカラーを指定できるところ。

少し違ったやり方でパレットはテクスチャで持って、
スプライトのテクスチャに加えて
もう一段マテリアルに、パレットテクスチャを
指定する方法がある。
アセットストアにあるアセットのひとつに
OldSkool Palette Sprites
https://www.assetstore.unity3d.com/jp/#!/content/8649
というものが実はあって、
紹介動画を見ると、
パレットテクスチャを作る方法をとっている。
OldSkool Palette Sprites Tutorial - YouTube

こちらのほうが現実的な、運用に良い方法に思う。


追記。
仕組み上、アルファテクスチャはポイントサンプリングにする必要があるので、
そういうビジュアルで大丈夫な用途に限ったほうが良さそう。
これは紹介しているアセットも同じで。