배경
폴더가 하이어라키의 거울인데, 씬에 붙지 않는 파일은 비칠 대상이 없다.
UI/의 규칙은 <캔버스>/<Presenter>/(UI 규칙.md §5)인데,
프리팹·씬에 붙지 않는 파일에는 대응하는 오브젝트가 없어 갈 곳이 정해져 있지 않다.
그래서 두 자리에 쌓였다.
| 지금 | 무엇이 문제인가 |
|---|---|
Storage/StorageGridPresenter/에 6개 |
Presenter 1 + 프리팹에 붙는 View 1 + 안 붙는 것 4(공급자 3 · 값 struct 1)가 평평하게 섞였다 |
UI/System/에 정적 헬퍼 4개 |
#System Canvas와 무관하고 Login·Main·Market·Storage·Widget이 쓴다. System 규칙.md가 "어디에도 속하지 않는 것들" 이라 적어 두고 그 자리에 두었다 |
이름도 거짓이다.
InventorySlotView·StorageSlotData는 창고 소유가 아니다 —System/GachaResultPresenter가 같은 클래스·같은 프리팹·같은 struct를 쓴다. 위치와 이름이 둘 다 거짓이라 창고를 고치다 가챠 결과창을 조용히 바꾸게 된다.StorageInformationPresenter는 2026-09-04에 판매 목록이 그 자리를 차지해 이름과 역할이 어긋난 채 문서에 미뤄져 있었다(UI 배치 현황.md4장).
여기에 낡은 서술 10건과 씬 오브젝트 표기 2건이 함께 나왔다. T-048이 표시 방식을 바꿨는데 주석·문서가 안 따라온 것이 7건, 그 전부터 낡은 클래스 이름이 3곳, 그리고 씬의 Presenter 오브젝트 15개 중 둘만 단어를 붙여 썼다.
⚠️
tasks/T-047도 이 일감에서 함께 고친다. T-048이CharacterSlotSource의IndustryLabel호출을 걷어내서 T-047이 적어 둔 호출부 목록과 문서 갱신 항목이 낡았다. 일감 둘이 같은 줄을 다투지 않도록 정정은 여기서 한다.
할 일
1. T-048이 남긴 낡은 서술 (7건)
- [x]
Storage/StorageGridPresenter/InventorySlotView.cs:32-33— "캐릭터는 배치 상태가 들어와". 두 세대 전 사실이다(배치 상태 → 적성 요약 → 스트립). 캐릭터는 이제 이 자리를 안 쓴다 - [x]
StorageGridPresenter.cs:39Tooltip — "아이템 한 칸 프리팹". 캐릭터 칸도 이 프리팹이다 - [x]
System/GachaResultPresenter/GachaResultPresenter.cs:8·:30— "인벤토리와 같은 프리팹". 인벤토리 전용이 아니라 공유 칸이다 - [x]
Main/WorkStationSelectPresenter/WorkStationSelectPresenter.cs:27·:475— "적성 요약" → 스트립 - [x]
UI 배치 현황.md:245— "칸 보조 문구 = 적성 요약" → 스트립(5칸 · 위치=산업 · 0은X) - [x]
UI 배치 현황.md:42— 칸 프리팹 줄에 적성 스트립이 없다 - [x]
tasks/T-047:81·:89—CharacterSlotSource호출부가 사라졌다(호출부 둘 → 하나,WorkStationSlotView.cs:51).:89의 "Storage 규칙.md를 정정하라" 는 대상이 이미 없다.:88의System 규칙.md줄은 유효하니 남긴다
2. 그 전부터 낡아 있던 이름 (2건)
- [x]
GameDesign/design/ui/README.md:320—InventoryPresenter(2026-09-02에StorageGridPresenter로 개명됐다 · T-036). 공용 영역이라 이름만 손댄다 - [x]
tasks/T-015:41— 같은 낡은 이름
Storage 규칙.md:147의 "예전InventoryPresenter는…" 은 과거임을 명시한 서술이라 그대로 둔다.
3. UI/Shared/ 신설과 이동
AssetDatabase.MoveAsset으로 옮긴다 — .meta가 함께 움직여 GUID가 유지되므로 배선이 안 깨진다.
단일 어셈블리라 using·네임스페이스 수정도 없다.
- [x]
InventorySlotView.cs·StorageSlotData.cs←Storage/StorageGridPresenter/ - [x]
RarityPalette.cs·ResultMessages.cs·WorkStationProgress.cs·IndustryLabel.cs←UI/System/(⚠️IndustryLabel.cs는 T-047이 끝나면 삭제될 파일이다) - [x]
Shared 규칙.md신설 — 들어올 자격("캔버스에 속하지 않고 화면 표현에 쓰인다")과 들어올 수 없는 것(Managers/로 갈 상태 보유 서비스 ·Common/으로 갈 게임 모르는 범용 코드 · 한 캔버스만 쓰는 종속 View)을 못박는다.System 규칙.md의 정적 변환표 단락·표를 그대로 옮긴다 - [x] 공급자 3개는
StorageGridPresenter/에 그대로 — 창고 격자 전용이라Storage접두가 사실이다.Sources/하위 폴더는 만들지 않는다(이 이동만으로 그 폴더가 Presenter 1 + 공급자 3이 된다)
4. 칸·값 타입 개명 — SlotView / SlotData
- [x] ⚠️ 파일명과 클래스명을 같이 바꾼다. 한쪽만 바꾸면 MonoBehaviour가 "script cannot be loaded" 로 떨어져 프리팹 배선이 끊긴다
- [x] 참조:
StorageGridPresenter·GachaResultPresenter· 공급자 3 ·RarityPalette주석 - [x] 프리팹
InventorySlotView.prefab→SlotView.prefab+ 루트 오브젝트 이름도SlotView.[SerializeField]필드 이름slotPrefab은 그대로 두므로 인스펙터 배선이 유지된다
5. StorageInformationPresenter → SellCartPresenter
- [x] 폴더 · 파일명 · 클래스명 (
SellCartRowView.cs는 이름·자리 그대로 — 그 Presenter 전용 종속 View다) - [x] 씬 오브젝트
Information Presenter (↓ SUB VIEW)→Sell Cart Presenter (↓ SUB VIEW) - [x] 주석 참조 4곳 —
SellCartModel.cs:11·WorkStationSelectPresenter.cs:481·SellCartRowView.cs:26·:44 - [x] 씬의
m_EditorClassIdentifier문자열이 낡지 않게 씬을 열어 저장한다 - [x] ⚠️
UI 규칙.md:168의 이름 규칙 예시가 무효화된다 — 그 줄이 "StorageInformationPresenter처럼 캔버스 이름을 앞에 단다" 인데SellCartPresenter는 접두가 없다. 예시를StorageTabPresenter·StorageGridPresenter로 바꾸고 "접두는 바른 이름이 너무 일반적일 때만 붙인다" 를 더한다(MenuPresenter·GachaPresenter도 접두가 없다). 안 고치면 다음 사람이 이 개명을 규칙 위반으로 읽는다 - [x]
UI 배치 현황.md의 "이름과 역할이 어긋나 있다" 경고를 지우고, 좌클릭 상세의 "되살릴지 정하지 않았다" 를 T-050 안내로 바꾼다
6. 씬 오브젝트 표기 통일
씬 Presenter 오브젝트 15개 중 둘만 단어를 붙여 썼다. 나머지는 낱말로 띄운다
(WorkStation List Presenter — WorkStation은 한 낱말인 도메인 용어다).
- [x]
AmountInput Presenter→Amount Input Presenter - [x]
GachaResult Presenter→Gacha Result Presenter - [x] 오브젝트 이름을 코드가
Find로 찾는 곳이 없는지 먼저 확인한다 - [x] 문서:
System 규칙.md:60·:61·UI 배치 현황.md:88·:90·:265 - [x]
tasks/archive/T-032:93의 경로 표기는 그대로 둔다 — 그때의 기록이다
7. 마스터(Arca Unity Toolkit) 반영
프로젝트 고유명사가 섞이지 않은 범용 규칙만 올린다(/unity-skill-sync · 전역 CLAUDE.md).
- [x]
ugui-mvp/SKILL.md의 낡은 예시InventoryPresenter(:72·:205-206) → 중립적인 이름. 마스터에는 프로젝트 이름을 남기지 않는 것이 규칙이라, 개명 반영이 아니라 규칙에 맞추는 것이다 - [x] §5(폴더 규칙)에 "캔버스에 붙지 않는 공용 표현 부품의 자리" 한 절 추가 — 어느 uGUI MVP 프로젝트에나 생기는 문제다. ⚠️ 프로젝트 폴더·클래스 이름은 넣지 않는다
- [x] 사본과 마스터를 양쪽 비교해서 맞춘다(일방적으로 덮지 않는다) + 상단
최종 업데이트
완료 조건
InventorySlotView · StorageSlotData · StorageInformationPresenter · InventoryPresenter ·
AmountInput Presenter · GachaResult Presenter · UI/System/{RarityPalette,ResultMessages,IndustryLabel,WorkStationProgress}
가 .claude/Agent/·tasks/archive/(의도적 과거 기록) 밖에서 0건이고,
창고 두 탭 · 가챠 결과창 · 판매 담기→일괄 판매 · 수량 팝업이 플레이에서 그대로 돈다.
막고 있는 것 / 선행 일감
- 없음. 이동·개명 모두 GUID가 유지되고, 단일 어셈블리라 참조 수정도 파일 안에서 끝난다.
- T-047과 부분적으로 엮인다 — 본체(엑셀 출처)는 서버 몫이고
여기서는 낡아진 서술과
IndustryLabel.cs경로만 고친다.
관련 커밋
8342c65— 캔버스에 속하지 않는 UI 부품에 자리를 만든다 (0~7단계 한 커밋)
참고
UI 규칙.md§5 — 폴더가 하이어라키의 거울이라는 규칙UI/System/System 규칙.md— "어디에도 속하지 않는 것들" 단락Storage 규칙.md— "InventorySlotView는 창고 전용이 아니다" 절- T-048 — 낡은 서술 7건이 여기서 나왔다
진행 (2026-09-12) — 0~7단계 완료 · 플레이 확인만 남음
단계마다 커밋을 끊었다 — 문제가 나면 그 단계만 되돌릴 수 있다.
| 단계 | 무엇을 | 확인 |
|---|---|---|
| 0 | 일감 등록 (T-049 · T-050) | — |
| 1 | 낡은 서술 7건 + T-048 완료·보관 | grep |
| 2 | 낡은 이름 2건 (InventoryPresenter) |
grep |
| 3 | UI/Shared/ 신설 + 6개 이동 + Shared 규칙.md |
.meta 6개 동행 · 컴파일 0 에러 |
| 4 | SlotView / SlotData 개명 (+프리팹) |
프리팹 8필드 + 배열 5/5 · 씬의 slotPrefab 둘 다 SlotView |
| 5 | SellCartPresenter 개명 (폴더·파일·클래스·씬) |
씬 참조 6개 전부 유지 |
| 6 | 씬 표기 통일 (Amount Input · Gacha Result) |
컴포넌트 참조 유지 · 씬 diff 4줄 |
| 7 | ugui-mvp 마스터 반영 (범용 문장) |
사본↔마스터 diff = 기존 배너 3줄뿐 |
결정한 것
| 갈림길 | 결정 | 근거 |
|---|---|---|
| 가르는 축 | 캔버스/Presenter를 유지하고 예외 폴더 하나만 더한다 | 역할별 상위 폴더(Presenters/·Views/)로 가르면 "폴더를 열면 이 화면이 무엇으로 이뤄졌나 보인다"가 무너지고 한 화면을 고치려고 세 폴더를 오간다 |
| 공급자 3개 | 옮기지 않았다 | 창고 격자 전용이라 Storage 접두가 사실이다. Sources/도 안 만들었다 — 이동만으로 그 폴더가 Presenter 1 + 공급자 3이 된다 |
SellCartPresenter 접두 |
Storage를 붙이지 않는다 |
SellCartModel과 짝이 맞는 고유한 이름이다. 그래서 UI 규칙.md의 접두 규칙 문장을 함께 고쳤다 — 안 고치면 다음 사람이 이 개명을 규칙 위반으로 읽는다 |
| 마스터 반영 범위 | 예시 이름 + Shared/ 규칙만 |
프로젝트 폴더·클래스 이름은 넣지 않았다(전역 CLAUDE.md). 예시도 중립적인 ItemGridPresenter·ItemSlotView로 바꿨다 |
지뢰 / 주의사항
- 🔴
m_EditorClassIdentifier는 유니티가 다시 써 주지 않는다. 씬(:1303)과 프리팹(:1031)에 옛 클래스 이름이 문자열로 남았다 — 참조는 GUID라 안 끊기지만 텍스트만 낡는다.SetDirty+ 저장으로도 안 바뀌어 파일을 직접 고치고 재임포트했다. - ⚠️ 개명은 파일명과 클래스명을 같은 단계에서 바꾼다. 한쪽만 바꾸면 MonoBehaviour가 "script cannot be loaded" 로 떨어져 프리팹·씬 배선이 끊긴다.
- ⚠️
[SerializeField]필드 이름(slotPrefab)은 건드리지 않았다 — 타입만 바뀌어서 인스펙터 배선이 그대로 살아남았다. 필드 이름까지 바꾸면[FormerlySerializedAs]가 필요하다. - 씬 diff는 4줄뿐이다(오브젝트 이름 3 + 클래스 문자열 1). T-046 때처럼
RectTransform이 대량으로 다시 쓰이지는 않았다.
남은 것 — 없다 (플레이 확인 통과 · 2026-09-14)
- [x] 플레이 확인 — 창고 자원·캐릭터 탭 · 가챠 결과 팝업 · 판매 담기 → 일괄 판매 · 수량 팝업. 5·6단계가 씬을 만졌으니 뒤 둘이 핵심이다 — 통과 (2026-09-14)