Unity: Vector Graphics APIでSpriteに動的にColorを設定する方法
Vector Graphics APIで描く図形に色を設定するには、
StrokeクラスのColorフィールドにColor型の変数を代入し、
それをIDrawableを実装したクラスのPathPropertiesフィールドに代入しておくことで設定できます。
しかし、執筆時点(2018/07/22)では、
Spriteに対して動的に色を変更したい場合には、通常の設定方法ではうまくいきません。
(publicやSerializeFieldをつけた変数にインスペクタ上から色を設定したときなども同様)
今回はこの問題について、原因と解決方法を見つけたので書き記しておきます。
使用した環境
OS: macOS High Sierra
Unity: 2018.1.1f1
Vector Graphics: 1.0.0 - preview 13
解決方法
情報元は、Vector Graphics Preview PackageのForumです。
https://forum.unity.com/threads/vector-graphics-preview-package.529845/page-2#post-3533043
Unityの中の人によると、この問題はSprite RendererがSVG spriteによって既に使われている頂点カラーチャンネルを使用しようとすることによって起こるそうです。
そして、GPU Instancingを有効にすることによって、これを回避できるそうです。
具体的な回避の流れは、
- 新しいMaterialを作成し、ShaderにUnlit/Vectorを割り当てる(Gradientを使用している場合はVector/Gradient)
- MaterialのEnable GPU Instancingにチェックを入れ、SpriteRendererを持つGameObjectに割り当てる
- SpriteRendererに変更したいColorをセットしたMaterialPropertyBlockを渡す
といった感じになります。
3に関しては、こんな感じのコードで渡すことができます。
MaterialPropertyBlock block= new MaterialPropertyBlock(); SpriteRenderer sr = GetComponent<SpriteRenderer>(); //NewColorは変更したい色のColor型の変数 block.SetColor("_Color", NewColor); sr.SetPropertyBlock(block);