スクリプトでは 0~1、インスペクタでは 0~255
スクリプトで色を設定するには new Color() を使います。
var color = new Color(1.0f, 1.0f, 1.0f);
一方、インスペクタでカラーを設定する場合、こんな感じで 256 段階の表示。
例えばこんな色が欲しい場合、スクリプトで指定するにはどうしますか?
数字を 255 で割ろう!
var color = new Color(174.0f / 255, 85.0f / 255, 85.0f / 255, 128.0f / 255);
正解! 電卓で計算した値を入れるよりはマシ!
ただ…これを入力するの、ちょっと面倒💦
では、インスペクタをちょっと操作してみましょう。RGB 0-255 を RGB 0-1.0 に。
これならそのままの値が使える!
var color = new Color(0.6823f, 0.3333f, 0.3333f, 0.5019f);
たしかに! でも、これすらめんどくさい! コピペ3回も必要!
究極の面倒くさがりですが、意外とこういう部分で楽できるかどうかが、後々の開発スピードを変えてくるものです。
(色を変えて確認して…と、兼デザイナっぽい作業が多い個人開発では、特に重要)
また、別のツール使って色を拾った場合(Photoshop)は、そもそも 0 - 1.0 表示がなかったりします。
#AE5555 をコピペしてカラー指定したい
そこで注目したいのが Hexadecimal の値です。Photoshop では # の後に同じ値があります。
(css に慣れた人ならお馴染みの値ですね)
この数値は、RRGGBB の値を 16 進数で示したものです。
これを1度コピペするだけでカラー指定! そんなメソッドを作ってみましょう。
using UnityEngine; public class ColorGet { /// <summary> /// RGB を 0 ~ 255 で指定したカラー値を取得 /// </summary> /// <param name="r">赤</param> /// <param name="g">緑</param> /// <param name="b">青</param> public static Color Rgb(int r, int g, int b) { return new Color((float)r / 255.0f, (float)g / 255.0f, (float)b / 255.0f); } /// <summary> /// カラーを #RRGGBB の形で取得 /// </summary> /// <param name="hexrgb">16進数のカラー値 RRGGBB</param> public static Color Hex(int hexrgb) { int r = (hexrgb >> 16) & 0xff; int g = (hexrgb >> 8) & 0xff; int b = hexrgb & 0xff; return Rgb(r, g, b); } }
ColorGet.Rgb は 0 - 255 で指定したカラーを返します。
ColorGet.Hex は Hexadecimal の値をそのまま 16 進数として渡し、カラーを返します。
var color = ColorGet.Rgb(174, 85, 85); var color2 = ColorGet.Hex(0xAE5555);
16 進数は、数値の前に 0x をつける事で指定します。
補足:ビット演算を使いたくなければ
>> や && はビット演算です。
これを使わないコードだと、こんな感じでしょうか。
int r = (hexrgb / 65536) % 256; int g = (hexrgb / 256) % 256; int b = hexrgb % 256;
どっちが早いかは計測してないので定かではありませんが、そこまで差になることはないと思いますので、お好みで。
古くからコードを書いている人は、ビット演算を使いそう。私も…ウッ、頭が…。
実はそんな事しなくてもstring型で色指定できるUnity.ColorUtilityクラスなるものがあります。
https://docs.unity3d.com/ja/2018.4/ScriptReference/ColorUtility.html
そんなものもあるんですねー! 情報ありがとうございます☺