Kilimanjaro Warehouse

WEBとかゲーム開発のことについて書きます。

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を有効にすることによって、これを回避できるそうです。


具体的な回避の流れは、

  1. 新しいMaterialを作成し、ShaderにUnlit/Vectorを割り当てる(Gradientを使用している場合はVector/Gradient)
  2. MaterialのEnable GPU Instancingにチェックを入れ、SpriteRendererを持つGameObjectに割り当てる
  3. SpriteRendererに変更したいColorをセットしたMaterialPropertyBlockを渡す

といった感じになります。

3に関しては、こんな感じのコードで渡すことができます。

MaterialPropertyBlock block= new MaterialPropertyBlock();
SpriteRenderer sr = GetComponent<SpriteRenderer>();
//NewColorは変更したい色のColor型の変数
block.SetColor("_Color", NewColor);
sr.SetPropertyBlock(block);

参考:
Unity - Manual: GPU instancing

思ったこと

Vector Graphics API はまだpreview版ということで、
これから不具合の修正や新機能の追加がたくさん行われていくと思います。
その中で、この問題がもっと手軽に解決するようになれば良いなと思いました。