ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】iTween実行時のエラー「Material doesn’t have a color property ‘_Color’」について

time 2016/02/07

※本記事投稿時に使用したiTweenのバージョンは2.0.5です。

shot2ss20160207230450889

というわけで、iTweenでColor系やFade系の関数を使った際、

「Material doesn’t have a color property ‘_Color’」

といったエラーが出ることがあります。
意味はそのままで、「マテリアルに_Colorというプロパティがない」といった感じでしょうか。

その「Color_」ですが、Unity5標準のシェーダーには大抵入っている基本的なプロパティです。
iTween実行時もデフォルトでは_Colorを変化させるようです。
ただし、パーティクル系のシェーダーなどは「_TintColor」となっていたりします。
故に「実行対象のオブジェクトの子にパーティクルがある」といったケースで発生しやすいエラーです。

対処法

エラーが出ても他のマテリアルの変化は正常に行われるわけですが、やはりエラーは嫌なものです。
ということで、iTween.csの該当部分を修正してみました!
バージョン2.0.5版でいくと3338行目付近になります。

for (int i = 0; i < GetComponent<Renderer>().materials.Length; i++) {
    if (gameObject.GetComponent<Renderer>().materials[i].HasProperty(namedcolorvalue.ToString())) {
        colors[i,0]=GetComponent<Renderer>().materials[i].GetColor(namedcolorvalue.ToString());
        colors[i,1]=GetComponent<Renderer>().materials[i].GetColor(namedcolorvalue.ToString());
    }
}

for文でマテリアルの数だけGetColorを実行しています。
その後のGetColor()でエラーが出ているため、その手前でMaterial.HasPropety()で該当のプロパティ(この場合は_Color)があるかをチェックします。
これでプロパティが存在しない場合でもエラーが出なくなります。

もし自作シェーダーなどでプロパティ名が統一されている場合、iTween実行時のパラメータ「NamedColorValue」を指定する手もあります。
これがデフォルトでは_Colorになっているので、文字列でプロパティ名を指定すればOKです。

まとめ

そんなわけで、超さくっとiTweenのエラーについてのお話でした!
その場で直しても時間が経つと忘れてしまったりするので、面倒でも記事にして残していきたいです。

そもそもiTweenのソースって勝手に変えていいものか分かっていなかったりします。
オープンソースだし大丈夫だと思われますが・・・。

down

コメントする