Unityのスプライトの色をコード上から変える方法まとめ
方法がいくつか見つかりました。演算速度に差はあれど結果としては変わらないのでどれが良いのか迷います。
- shaderで変更
- sprite/textureをcolorで変更
- あらかじめ色の変わっている画像を用意しておいて挿げ替える(直接色を変えるわけではないので割愛)
各手法のやり方
shaderで変更
今回使ったコードはここ画像の色相を変更する.
コード上からカスタムプロパティを変更する方法はこことかマテリアルのプロパティをスクリプトから変更【Unity】参照して作ります。
全体像は参考リンクを参照してください。変更したのは次の箇所だけです。
1Properties
2{
3 [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
4 //ここから
5 _Red("AddRed", Float) = 150
6 _Green("AddGreen", Float) = 150
7 _Blue("AddBlue", Float) = 150
8 //ここまで
9 _Color ("Tint", Color) = (1,1,1,1)
10
11 _StencilComp ("Stencil Comparison", Float) = 8
12 _Stencil ("Stencil ID", Float) = 0
13 _StencilOp ("Stencil Operation", Float) = 0
14 _StencilWriteMask ("Stencil Write Mask", Float) = 255
15 _StencilReadMask ("Stencil Read Mask", Float) = 255
16
17 _ColorMask ("Color Mask", Float) = 15
18
19 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
20}
21
22…(中略)…
23
24fixed3 shift_col(fixed3 RGB, half3 shift)
25{
26 fixed3 RESULT = fixed3(RGB);
27
28 RESULT.x += shift.x / 255;
29 RESULT.y += shift.y / 255;
30 RESULT.z += shift.z / 255;
31
32 return (RESULT);
33}

このようにしてマテリアルを作成し、色を変更したいオブジェクトに付与します

そしてインスペクタから値を設定することで色を変化させることができるようになります。
この時の注意点としては(私はこの時までマテリアルを理解していなかったため困ったのですが)
マテリアル全体に対して色を変化させるため,同じ変化を与えたいもの同士でマテリアルを共有する必要があります。
そのため別の色変化を与えたい場合は、対象ごとにマテリアルを用意する必要があります。
また次のようにマテリアルのプロパティにアクセスすることで、コード上から動的に変更することができます。
1/// <summary>
2/// 背景用のマテリアルの色を変える
3/// </summary>
4/// <param name="mat">変更するマテリアル</param>
5/// <param name="col">RGBカラーで指定</param>
6private void ChangeBackgroundMaterial(Material mat, Color col)
7{
8 mat.SetFloat("_Red", col.r * 255.0f);
9 mat.SetFloat("_Blue", col.b * 255.0f);
10 mat.SetFloat("_Green", col.g * 255.0f);
11}
総括(というか感想)
- shaderはちょっと毛並みが違って大変。デバッグも手軽ではなさそうで調べるのを途中でやめてしましました。
- 現在の色をもとに変化させる、的な物はちょっと難しそうな印象。よくわからないまま諦めました。
- 速いらしいので頑張る気になる(実際にプロファイルをとるほどのやる気までは出ませんでした)
sprite/textureをcolorで変更
- spriteのcolorで変更
- インスペクタで指定する
- UnityEditorでできるため割愛
- コードからの変更
- こことか見ましたUnity C# スプライトの色変更と、透明度変更
- まあこれ以上のことはないかと思います
- インスペクタで指定する
- textureのcolorで変更
- Unityで学ぶ画像処理【色の変換編】
- 以前の記事ですと書いてあるTextureをスクリプトから編集してみるも読んでおかないと(元絵を編集可能にするという点で)ハマる。ハマった。
こっちは簡単だったので記録が残っていません。まあ雰囲気でわかるということで。
(使い分けていない人間の書く)使い分け方予想
- shaderで変更
- GPU使用が前提となるので高速
- シェーダ言語が書ける人
- リアルタイムに変えたい処理がある場合
- sprite/textureをcolorで変更
- シェーダ言語が書けない人
- 1ピクセルずつ色を変えていくため、リアルタイムにやると低速(それが効くレベルのソフトかどうかでこの手法が使えるかが決まる)
- 事前に変えておく(Resource.Loadで代用する)とかロード時などタイミングを決めてやる分には低負荷。ただしRAMは消費する。
つまりできるならshader。ちょっとしたことでコストをかけたくないならそれ以外の手段も検討可能。ぐらい?のイメージです(シェーダ言語よりC#の方が書ける人間の言い分)。