Skip to content

Unityのスプライトの色をコード上から変える方法まとめ

   

Unityのスプライトの色をコード上から変える方法まとめ

方法がいくつか見つかりました。演算速度に差はあれど結果としては変わらないのでどれが良いのか迷います。

  • shaderで変更
  • sprite/textureをcolorで変更
  • あらかじめ色の変わっている画像を用意しておいて挿げ替える(直接色を変えるわけではないので割愛)

各手法のやり方

shaderで変更

今回使ったコードはここ画像の色相を変更する.

コード上からカスタムプロパティを変更する方法はこことかマテリアルのプロパティをスクリプトから変更【Unity】参照して作ります。

全体像は参考リンクを参照してください。変更したのは次の箇所だけです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Properties
{
  [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
  //ここから
  _Red("AddRed", Float) = 150
  _Green("AddGreen", Float) = 150 
  _Blue("AddBlue", Float) = 150 
  //ここまで
  _Color ("Tint", Color) = (1,1,1,1)

  _StencilComp ("Stencil Comparison", Float) = 8
  _Stencil ("Stencil ID", Float) = 0
  _StencilOp ("Stencil Operation", Float) = 0
  _StencilWriteMask ("Stencil Write Mask", Float) = 255
  _StencilReadMask ("Stencil Read Mask", Float) = 255

  _ColorMask ("Color Mask", Float) = 15

  [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
}

(中略)

fixed3 shift_col(fixed3 RGB, half3 shift)
{
  fixed3 RESULT = fixed3(RGB);

  RESULT.x += shift.x / 255;
  RESULT.y += shift.y / 255;
  RESULT.z += shift.z / 255;

  return (RESULT);
}

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

alt
そしてインスペクタから値を設定することで色を変化させることができるようになります。

この時の注意点としては(私はこの時までマテリアルを理解していなかったため困ったのですが)
マテリアル全体に対して色を変化させるため,同じ変化を与えたいもの同士でマテリアルを共有する必要があります。

そのため別の色変化を与えたい場合は、対象ごとにマテリアルを用意する必要があります。

また次のようにマテリアルのプロパティにアクセスすることで、コード上から動的に変更することができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/// <summary>
/// 背景用のマテリアルの色を変える
/// </summary>
/// <param name="mat">変更するマテリアル</param>
/// <param name="col">RGBカラーで指定</param>
private void ChangeBackgroundMaterial(Material mat, Color col)
{
    mat.SetFloat("_Red", col.r * 255.0f);
    mat.SetFloat("_Blue", col.b * 255.0f);
    mat.SetFloat("_Green", col.g * 255.0f);
}

総括(というか感想)

  • shaderはちょっと毛並みが違って大変。デバッグも手軽ではなさそうで調べるのを途中でやめてしましました。
  • 現在の色をもとに変化させる、的な物はちょっと難しそうな印象。よくわからないまま諦めました。
  • 速いらしいので頑張る気になる(実際にプロファイルをとるほどのやる気までは出ませんでした)

sprite/textureをcolorで変更

こっちは簡単だったので記録が残っていません。まあ雰囲気でわかるということで。

(使い分けていない人間の書く)使い分け方予想

  • shaderで変更
    • GPU使用が前提となるので高速
    • シェーダ言語が書ける人
    • リアルタイムに変えたい処理がある場合
  • sprite/textureをcolorで変更
    • シェーダ言語が書けない人
    • 1ピクセルずつ色を変えていくため、リアルタイムにやると低速(それが効くレベルのソフトかどうかでこの手法が使えるかが決まる)
    • 事前に変えておく(Resource.Loadで代用する)とかロード時などタイミングを決めてやる分には低負荷。ただしRAMは消費する。

つまりできるならshader。ちょっとしたことでコストをかけたくないならそれ以外の手段も検討可能。ぐらい?のイメージです(シェーダ言語よりC#の方が書ける人間の言い分)。

  1. Unityで2Dシーン編集競合対策
  2. Gitホスティングサービスについて
  3. 課題管理サービスについて
comments powered by Disqus