[Unity] ColorとColor32の違い

[Unity] ColorとColor32の違い

Unityで色を扱う機会はそこそこ多いんですが、色を扱う際には基本的にColor構造体を利用すると思います。

ただ、その他にもColor32構造体も存在していて、何の違いなんだろうと気になった次第です。

結論:データの保持方法の差

結論から言うと、Colorの場合は色情報を内部的にfloatで保持しているのに対し、Color32の場合は色情報をbyteで保持している、という違いでした。

色というのは赤青緑(RGB)の3原色をどれぐらいの比率で表示するかの差で表現しています、例えば白色なら全ての3原色は最大値になり、黒色なら逆に全て0になります。

これについては知っている方も多いと思いますが、この「各3原色の値をどのデータ型で保持するか?」の差が今回の本題になります。

データ型の違いによる差

色表現の幅

Colorの場合は色情報をfloatで保持するので、非常に細かい色の表現が可能になります、3つの色の組み合わせなんて考えたらとんでもない数になるのはなんとなく理解できますね。

一方でColor32の場合はbyteで保持するので、1つの色につき0~255の値しか取れません。

つまり3つの色の組み合わせのパターンは256x256x256で約1677万色を表現できます、この数字は聞いたことがある方も居るんじゃないでしょうか?

PCにおいて一般的な色の表現がこの1677万色になっており、現代ではこの1677万色を表現できるモニター等が最も一般的です。

これだけの表現力があれば、人間の目にはほとんど色の違いが分からないぐらいの階調を表現できるからですね。

メモリ使用量

ColorとColor32をそれぞれ使った時のメモリ使用量には差が出ます。

先程も書きましたがそれぞれの構造体ではデータ型の違いがあり、floatでは1つの色につき4byte、byteでは1つの色につき1byteを食うので、RGB+A(アルファ値)の4つの合計でそれぞれ16byte、4byteが最終的なメモリ消費量です。

構造体可能表現色数データ型1要素のデータ消費量合計
Colorほぼ無限大float4byte(32bit)16byte(128bit)
Color32約1677万色byte1byte(8bit)4byte(32bit)

使い方

ColorとColor32ではインスタンス化する際の引数の指定に差があります、とは言うものの単にfloatなのかbyteなのかぐらいです。

Color color = new Color(1f, 0.5f, 0f, 1f);

これがColorを使用したオレンジ色の生成方法。

Color32 color32 = new Color32(255, 128, 0, 255);

一方こちらがColor32を使用したオレンジ色の生成方法。

Color32の指定方法はカラーコードの知識があると分かりやすいと思います、というよりもこちらの方が直感的に理解しやすい人も多いでしょう。

上記それぞれの色は#FF8000のカラーコードで表現出来ますが、FF8000は10進数に変換すると255,128,0になるので、Color32はその値をそのまま入れているだけですね。

どっちを使えば良い?

結論から言うとどっちでも良いと思います。

ただ、特に理由がなければColor32の方で良いかなというレベル、データも小さいですし1677万色表現できればまず人間の目で見た時に滑らかに色遷移できますしね。

特に大量に色を扱ったりする場合はColor32が良いですね。

Unity標準の関数だったりサードパーティー製のアセットではColorを引数に取る場合が多いですが、Color32からColorへの変換はUnityがよしなにやってくれるのでこれも大して気にしなくて良いと思います。

コメントを残す

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