[unity]スクリプトで、Color を #AA9955 のような css 表記で設定したい

スクリプトでは 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 表示がなかったりします。

Photoshop のカラーピッカー

#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;

どっちが早いかは計測してないので定かではありませんが、そこまで差になることはないと思いますので、お好みで。

古くからコードを書いている人は、ビット演算を使いそう。私も…ウッ、頭が…。

2件のコメント

catsnipe へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA