バージョン
- Unity 2022.3.45f1
Unityの色を司る構造体ColorとColor32の比較です。
結論
ちりつもになるので基本はColor32、高精度の色を表現したい箇所だけColor!
テスト環境
空のオブジェクトに以下のスクリプトをアタッチします。
using UnityEngine;
using System;
public class ColorVsColor32 : MonoBehaviour
{
private int testCnt = 1000000;
void Start()
{
//Colorメモリ使用量
Debug.Log($"Color: {GetColorMemory():F2}KB");
//リセット
ResetMemory();
//Color32メモリ使用量
Debug.Log($"Color32: {GetColor32Memory():F2}KB");
}
private float GetColorMemory()
{
long startMemory = GC.GetTotalMemory(true);
Color[] colors = new Color[testCnt];
for (int i = 0; i < testCnt; i++)
{
colors[i] = new Color(1.0f, 0.0f, 0.0f, 1.0f);
}
long endMemory = GC.GetTotalMemory(true);
return (endMemory - startMemory) / 1024f;
}
private void ResetMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
private float GetColor32Memory()
{
long startMemory = GC.GetTotalMemory(true);
Color32[] color32s = new Color32[testCnt];
for (int i = 0; i < testCnt; i++)
{
color32s[i] = new Color32(255, 0, 0, 255);
}
long endMemory = GC.GetTotalMemory(true);
return (endMemory - startMemory) / 1024f;
}
}Color、Color32のインスタンスをそれぞれ100万個生成してメモリ使用量を確認します。
検証
上記スクリプトの実行結果は次のようになりました。

Color32の方がメモリ使用量が少なくなりました。
Colorのfloat型が1成分のデータにつき32ビット、Color32ではbyte型で8ビットのためColorの方が約4倍のメモリ消費となります。微々たる差ではありますが、Color32に軍配が上がる結果となりました。
| 構造体 | 色成分のデータ型 | データ量/データ | 合計データ量 |
|---|---|---|---|
| Color | float | 32ビット | 128ビット(16バイト) |
| Color32 | byte | 8ビット | 32ビット(4バイト) |
まとめ
Color32の勝利!!
めちゃくちゃ色のこだわりがあったり、大量の色情報を扱う等が無い限り、通常はColor32を使った方がメモリ効率は良いです。
とはいえ、ほとんど差がないためコードの好みで良いかと思います。
Color - Unity スクリプトリファレンス
RGBA カラーの表現をします。
Color32 - Unity スクリプトリファレンス
32 ビット形式での RGBA の色の表現をします。


