· No.13
Unity USS 에서 8자리 색상 #RRGGBBAA 는 조용히 버려진다 — 값이 틀린 게 아니라 변수가 없었다
UI 토큰 6줄이 엔진에서만 사라졌다. 생성기도 검산기도 초록이었고, 값을 아무리 대조해도 맞았다. 틀린 값을 찾고 있었던 것이 문제였다 — USS 파서는 8자리 HEX 를 만나면 그 선언 전체를 버리고 경고도 안 낸다. 값 대조에서 존재 대조로 검사를 바꾸기까지, 그리고 같은 반의 결함 셋(url 기준 혼재·알파 사본 3값·색공간 보정)을 어떻게 같이 잡았는지.
승인된 UI 시안을 토큰·목업·기획 문서·엔진 실기 네 층에 반영하는 작업이었다. 스타일시트를 다시 굽고 목업 12장을 다시 굽고 문서의 표를 갱신하고 엔진에서 씬을 열었다.
엔진에서만 색이 달랐다. 그것도 전부는 아니고 여섯 줄이었다.
처음에는 값을 의심했다
가장 자연스러운 가설이다. 생성기가 잘못된 값을 뱉었거나, 사본 중 하나가 낡았거나, 문서와 코드가 갈렸거나. 우리 파이프라인에는 사본이 실제로 여러 개 있다 — 생성기가 만드는 스타일시트, 목업 PNG 를 굽는 코드, 기획 문서의 표, 엔진이 읽는 파일.
그래서 값을 대조했다. 전부 맞았다. 문서의 값과 생성기의 값이 같고 파일에 그 값이 글자 그대로 들어 있고 검산 스크립트가 종료코드 0 을 냈다.
여기서 한 번 더 같은 방향으로 갈 뻔했다. 값이 맞는데 화면이 다르면 다음 후보는 보통 「적용 순서」나 「우선순위」다. 선택자 특이도, 상속, 인라인 스타일 — CSS 계열에서 색이 안 먹으면 열에 아홉은 그쪽이다.
틀렸다는 걸 알려준 것은 화면이 아니라 목록이었다
방향을 바꾼 지점은 단순했다. 「이 변수가 무슨 값인가」를 묻는 대신 「이 변수가 있는가」를 물었다.
없었다. 여섯 줄 전부, 엔진이 읽은 스타일시트 안에 변수 자체가 존재하지 않았다.
원인은 표기법이었다. 우리 토큰은 알파를 포함한 8자리 표기(#RRGGBBAA)를 쓰고 있었고, Unity 의 USS 파서는 그 표기를 인식하지 못한다. 인식하지 못하면 그 선언을 통째로 버린다. 에러도 아니고 빨간 줄도 아니다. 파일은 정상적으로 로드되고 나머지 규칙은 다 살아 있고 그 여섯 줄만 처음부터 안 적힌 것처럼 된다.
그래서 값 대조가 통과한 것이다. 값 대조는 파일에 글자가 있는지를 본다. 파서가 그 글자를 받아들였는지는 안 본다. 우리가 쓴 검산기는 파일을 열어 정규식으로 값을 뽑아 문서와 맞춰 보는 물건이었고, 그 관점에서 파일은 완벽했다.
고치는 방법이 두 갈래였고, 다른 쪽을 골랐다
바로 떠오르는 수정은 여섯 줄을 rgba() 로 바꾸는 것이다. 5분이면 끝난다. 실제로 그것도 했다. 그런데 그렇게만 끝내면 다음에 누가 8자리를 다시 쓰면 똑같이 사라진다. 사라진다는 사실 자체가 안 보이는 종류라서 다음 사람도 값부터 의심하고 같은 반나절을 쓴다.
그래서 수정의 무게를 값이 아니라 표기 규칙에 실었다.
- 스타일시트 전체에 8자리 HEX 금지 검사를 걸었다. 하나라도 있으면 종료코드가 0 이 아니다.
rgba()로 바꾼 값이 원래 8자리와 같은 색인지 왕복 검사를 넣었다. 표기를 바꾸다가 알파를 0~1 과 0~255 로 헷갈리는 것이 이 변환의 전형적인 사고다.- 그리고 검사의 관점을 값 일치에서 존재 여부로 옮겼다. 문서에 있는 토큰이 엔진이 읽는 파일에 선언으로 살아 있는가를 대조한다. 이 대조가 지금 69건이다.
같은 반의 결함이 셋 더 있었다
관점을 바꾸자마자 같은 종류가 줄줄이 나왔다. 전부 「틀린 값」이 아니라 「조용히 없어지는 것」이다.
url() 의 기준 경로가 뒤섞여 있었다. 9줄이 엉뚱한 곳을 가리킬 수 있는 상태였는데, 엔진은 경로를 못 찾으면 경고만 내고 그 규칙을 버린다. 경고는 콘솔 수천 줄에 묻힌다. → url() 이 가리키는 파일이 실제로 존재하는지를 검사에 넣었다.
채움 알파가 여섯 곳에 흩어져 세 값으로 갈려 있었다(0.22 / 0.18 / 0.18). 네 번째 사본은 스타일시트가 아니라 마커 PNG 를 굽는 파이썬 코드였다. 토큰을 아무리 맞춰도 그림이 어긋나는 종류다. → 단일 상수 하나에서 문서 2곳·토큰 3곳·PNG 1곳이 파생되게 바꿨다.
색공간 보정이 빠져 있었다. 코드로 직접 그리는 레이어에서 보정을 안 걸어 첫 스크린샷의 지도와 주사선이 전부 밝게 나왔다. 이건 값도 맞고 선언도 살아 있는데 그리는 단계에서 달라지는 경우라 파일을 아무리 봐도 안 보인다.
검사기를 믿기 전에 검사기를 틀리게 해 봤다
새 검사 네 종을 넣고 마지막에 한 가지를 더 했다. 일부러 값을 흔들어서 전부 걸리는지 확인했다. 8자리를 하나 심고 url() 을 없는 파일로 바꾸고 알파를 한 자리만 다르게 하고 문서의 토큰 이름을 하나 지웠다. 네 개 다 종료코드가 0 이 아니었다.
이 절차가 없으면 검사기는 「통과했다」와 「아무것도 안 보고 있다」를 구별해 주지 않는다. 이번 건이 정확히 그 사례였다 — 검산기는 내내 초록이었고 그 여섯 줄은 내내 없었다.
남은 자리
rgba() 왕복 검사는 표기 변환만 본다. 색을 의도적으로 바꾼 경우와 실수로 바꾼 경우를 구별하지 못한다. 지금은 문서가 정본이라는 전제로 버티고 있는데, 문서를 고치면서 토큰을 안 고치면 그때는 대조가 잡아 준다. 반대 방향 — 둘 다 같이 틀리게 고치는 것 — 은 아직 아무것도 못 막는다.