유니티 Color Hex 값 편리하게 사용하기

2024. 2. 28. 00:35Unity, C# 프로그래밍

보통 컬러값을 사용할 때 Hex 코드를 많이 사용하는데

Hex코드를 간단하게 코드에서 사용할 수 있게 하는 법을 정리했다.

 

보통 헥스코드는 아래처럼 되어있는데

8자리인 경우(RGBA or ARGB)도 있고 6자리(RGB)인 경우도 있다.

 

유니티의 색상 에디터

 

#FF0000FF

#86B996FF

 

유니티에서는 RGB만 코드로 표현하지만 실제 Alpha 값까지 지정해서 사용하는 경우가 많기 때문에

오늘은 RGBA 기준으로만 작성했다.

 

(코드를 보고 살짝만 수정하면 RGB or ARGB도 지원하게 만들 수 있다)

 

public static class ColorHex
{
    /// <summary>
    ///     0xRRGGBBAA
    /// </summary>
    public static Color32 FromRgba(uint rgba)
    {
    	// 비트 시프트 연산을 이용해서 인자 rgba로부터 필요한 채널만 각각 분리한다.
        byte r = (byte)((rgba >> 24) & 0xFF);
        byte g = (byte)((rgba >> 16) & 0xFF);
        byte b = (byte)((rgba >> 8) & 0xFF);
        byte a = (byte)(rgba & 0xFF);
		
        // Color32 형으로 반환 (Color 구조체로의 암시적 형변환을 지원한다)
        return new Color32(r, g, b, a);
    }
}

 

색상의 한 채널 (빨강, 초록, 파랑) 은 각각 0 ~ 255 까지의 범위를 가지고 있고

이건 1바이트(8비트)로 표현할 수 있다.

 

이때 rgba 4개의 채널을 모두 표현하려면 x4 해서 4바이트 내로 표현할 수 있기 때문에 4바이트 자료형인 uint를 사용했다.

 

사용할 때는 아래처럼 사용하면 되는데 0x 이후의 각 2자리마다 순서대로 RRGGBBAA 이렇게 사용한다.

void Start()
{
    Image image = GetComponent<Image>();
    image.color = ColorHex.FromRgba(0x86B996FF);
}

 

위 예시는 채널별로 분리하면 다음과 같다.

R:134, G:185, B:150, A:255

 


 

작성하다 보니 유니티 에디터에서는 대부분 #RRGGBB 형식으로 보여줘서

많이 사용할 것 같은 FromRgb 함수도 같이 올립니다.

 

FromArgb 함수가 필요하다면 위의 FromRgba 함수에서 순서만 바꿔서 읽으면 됩니다.

 

/// <summary>
///     0xRRGGBB
/// </summary>
public static Color32 FromRgb(uint rgb)
{
    // rgb까지는 인자에서 가져오고 a(알파) 채널은 255 고정.
    byte r = (byte)((rgb >> 16) & 0xFF);
    byte g = (byte)((rgb >> 8) & 0xFF);
    byte b = (byte)(rgb & 0xFF);
    byte a = 255;

    return new Color32(r, g, b, a);
}