미로의 개발노트

Entity Forge

Entity Forge 미지원 필터 예외 수정과 행 선택 피드백

개발 기록 · 블로그 공개

원본 기록 상태 진행

필터 변경 시 이전 목록 인덱스로 새 목록을 읽는 예외를 수정했습니다. 왼쪽 전체/미지원 필터, 행 호버·선택 배경과 강조선·대상 경로·키보드 선택을 연결했습니다.

기준 UI: 사용자 제공 이전 화면의 오른쪽 미지원 필터와 목록
기준 UI: 사용자 제공 이전 화면의 오른쪽 미지원 필터와 목록

작업 결과

바인더는 목록 생성 시 한 번만 연결하고 매 호출 때 현재 itemsSource에서 범위를 검사해 항목을 가져오도록 수정했습니다. 필터 전환 시 콜백을 교체하지 않습니다. 재사용 해제 시 userData를 비워 이전 행의 클릭 대상이 남지 않게 했습니다.


변경 내용

재현 조건

Unity 6000.0.83f1, Entity Forge Editor. 사용자 스택과 현재 소스로 원인 확인; 화면 조작 제한 유지.

재현 순서

씬 분석 후 기존 미지원만 표시 필터를 켭니다. 기존 전체 목록보다 필터 결과가 적거나 빈 경우 새 콜백이 이전 목록 인덱스로 호출됩니다.

기대 동작

범위 예외 없이 필터 결과를 표시하고 선택한 행과 대상이 명확히 드러납니다.

실제 동작

사용자 로그: ListView.set_bindItem → RefreshItems → BindRows 콜백의 rows[index]에서 ArgumentOutOfRangeException.

원인

BindRows가 새 rows 스냅샷을 캡처한 bindItem을 먼저 지정하고 itemsSource를 나중에 바꿨습니다. bindItem setter가 즉시 기존 source를 다시 바인딩하는 호출 순서가 사용자 스택에 명시돼 있습니다. 따라서 필터로 짧아진 새 rows에 이전 인덱스를 적용했습니다.

적용 내용

멀리 떨어진 미지원 체크박스를 목록 왼쪽의 전체/미지원 필터 버튼으로 교체했습니다. 행 높이는 34px로 통일하고 상태의 두꺼운 배경을 제거했습니다. 호버 배경, 선택 배경과 3px 왼쪽 강조선, 하단 전체 선택 경로를 연결했습니다. 클릭 후 목록 키보드 포커스를 유지하며 Enter/Space로 선택 대상을 찾아갑니다. Entity Forge 창을 유지하고 대상 선택·화면 맞춤을 실행하는 기존 원칙은 유지합니다. 9개 언어 문서와 필터 번역을 갱신했습니다.

이전 요청에서 제공한 기준 화면을 재사용했습니다. 현재 수정 후 실제 캡처는 화면 조작 제한으로 미확보이며 전후 시각 검증 완료로 표시하지 않습니다.


검증

분리한 .NET 재현 모델에서 이전 캡처 방식은 같은 ArgumentOutOfRangeException을 재현했습니다. 현재 source를 읽는 방식은 전체/빈 목록 100회 교체와 범위 밖 인덱스에서 예외 없이 통과했습니다. 이 검사는 Unity 네이티브 UI 실행이 아닌 호출 순서 모델 검사입니다.

7개 어셈블리를 설치 Unity 참조로 컴파일하고 입력 해시와 마지막 소스를 대조했습니다. 초기 한 번 바인딩, 현재 source 조회/범위 검사, 필터/선택/호버 연결 소스 검사, UI 453키×9언어·치환 인자, 문서 9개/126개 링크 검사와 388개 패키지 원본/메타 byte readback 통과. 검사 JSON


개발 화면

기준 UI: 사용자 제공 이전 화면의 오른쪽 미지원 필터와 목록


출처

중앙 아카이브 원문