EXECUTION EVIDENCE · 2026-10-19

실제 실행 테스트 보고서

샘플 씬의 실제 Play Mode 실행, 자동 데이터 검증과 성능 측정을 구분했습니다. 실패한 원본 기록도 보존합니다.

사용 가이드로 돌아가기 →

Unity 실행 검사 75개 통과최종 실패 0개런타임 오류 0개C# 자동 검증 8226개

실행 환경과 보존 범위

Unity6000.0.83f1 · Windows · 별도 검증 프로젝트
렌더링Play Mode 배치 실행은 OpenGL Core. 원본 작업 창은 Direct3D 11로 열려 있었으며, 검은 캡처의 원인은 미확인입니다.
프로젝트원본 Assets/DesignDataTable, Assets/Scenes와 ProjectSettings를 복사했습니다. UI·Sprite 패키지는 설치된 로컬 패키지를 참조했습니다.
원본 데이터원본 XLSX·CSV·바이너리를 테스트 입력으로 덮어쓰지 않았습니다. 샘플 C#·아이콘 임포트·메타 설정, 영어 기본 언어와 상점 씬 안내 문구 배치를 수정했습니다. 해시 대조 기록은 상점 씬 수정 전의 보존 검사입니다. 원본 이미지 픽셀은 변경하지 않았습니다.
실행 근거원본 데이터 87개 파일 해시 대조 · 최종 JSONL · Unity 검증 소스 · 성능 CSV

실행으로 재현하고 수정한 문제

문제수정수정 전 근거
재사용 투사체의 이전 소유자 유지ProjectileManager가 매번 소유자를 설정하도록 수정
최종: pass
실패 JSONL
game.pool-updates-owner
재사용 투사체의 이전 회전 유지위치와 회전을 함께 초기화하도록 수정
최종: pass
실패 JSONL
game.pool-updates-rotation
최초 표시 때 손상 체력을 100%로 덮어씀OnEnable에서 현재 대상의 실제 체력 비율 사용
최종: pass
실패 JSONL
game.hud-preserves-initial-damaged-health
이전 대상 이벤트 구독이 남음대상 전환 전에 이전 이벤트 구독 해제
최종: pass
실패 JSONL
game.hud-unsubscribes-previous-target
재활성화 시 체력과 구독 상태가 오래된 값으로 남음OnEnable에서 이벤트 재연결과 현재 값 동기화
최종: pass
실패 JSONL
game.hud-resynchronizes-after-reactivation
중복 플레이어 등록 시 ArgumentException기존 풀을 유지하고 중복 항목을 추가하지 않도록 수정
최종: pass
실패 JSONL
game.player-registration-is-idempotent
로고가 큐브맵으로 임포트되어 Texture2D 로드 실패아이콘 메타를 2D로 교정하고 전처리기에서 Texture2D를 강제. 네이티브 캐시와 원본의 RGBA 픽셀 비교로 검증
최종: pass
실패 JSONL
asset.logo-is-texture2d
상점 샘플 하단 안내가 화면 밖으로 잘림안내 문구를 Canvas 하단 왼쪽에 연결하고 20픽셀 여백으로 배치
최종: pass
실패 JSONL
shop.footer-inside-render

아이콘의 실제 임포트 타입 비교: Cubemap → Texture2D 실행 기록. 캐시 아이콘은 Unity가 이름 없는 텍스처로 복사하므로 이름 대신 RGBA 픽셀을 비교했습니다. 이는 Project 창을 눈으로 확인한 결과와는 구분합니다.

최종 Unity 검사 항목

런타임 객체·리소스·이벤트·생명주기를 실제 실행했습니다. 키보드를 눌러 조작하는 수동 플레이 테스트와는 구분합니다.

항목결과세부 내용
asset.logo-is-texture2dpassTexture2D
workbook.SampleCharacterpass5 rows, 5 columns
binary.matches-source.SampleCharacterpass
asset.native-xlsx-importer.SampleCharacterpass
asset.brand-icon.SampleCharacterpasscached=; expected=DesignDataTableLogo; RGBA mean difference=0
unity.xlsx-freeze-and-data-roundtrip.SampleCharacterpass
workbook.SampleDropItempass4 rows, 4 columns
binary.matches-source.SampleDropItempass
asset.native-xlsx-importer.SampleDropItempass
asset.brand-icon.SampleDropItempasscached=; expected=DesignDataTableLogo; RGBA mean difference=0
unity.xlsx-freeze-and-data-roundtrip.SampleDropItempass
workbook.SampleShopProductpass15 rows, 3 columns
binary.matches-source.SampleShopProductpass
asset.native-xlsx-importer.SampleShopProductpass
asset.brand-icon.SampleShopProductpasscached=; expected=DesignDataTableLogo; RGBA mean difference=0
unity.xlsx-freeze-and-data-roundtrip.SampleShopProductpass
workbook.SampleSkillpass3 rows, 8 columns
binary.matches-source.SampleSkillpass
asset.native-xlsx-importer.SampleSkillpass
asset.brand-icon.SampleSkillpasscached=; expected=DesignDataTableLogo; RGBA mean difference=0
unity.xlsx-freeze-and-data-roundtrip.SampleSkillpass
shop.missing-script-countpass0
shop.product-countpass15 / 15
shop.name.1passitem1
shop.thumbnail.1passgenericItem_color_001
shop.name.2passitem2
shop.thumbnail.2passgenericItem_color_002
shop.name.3passitem3
shop.thumbnail.3passgenericItem_color_003
shop.name.4passitem4
shop.thumbnail.4passgenericItem_color_004
shop.name.5passitem5
shop.thumbnail.5passgenericItem_color_005
shop.name.6passitem6
shop.thumbnail.6passgenericItem_color_006
shop.name.7passitem7
shop.thumbnail.7passgenericItem_color_007
shop.name.8passitem8
shop.thumbnail.8passgenericItem_color_008
shop.name.9passitem9
shop.thumbnail.9passgenericItem_color_009
shop.name.10passitem10
shop.thumbnail.10passgenericItem_color_010
shop.name.11passitem11
shop.thumbnail.11passgenericItem_color_011
shop.name.12passitem12
shop.thumbnail.12passgenericItem_color_012
shop.name.13passitem13
shop.thumbnail.13passgenericItem_color_013
shop.name.14passitem14
shop.thumbnail.14passgenericItem_color_014
shop.name.15passitem15
shop.thumbnail.15passgenericItem_color_015
shop.footer-inside-renderpass(20.00, 20.00);(20.00, 75.00);(1020.00, 75.00);(1020.00, 20.00)
game.missing-script-countpass0
game.player-existspass
game.enemy-countpass4
game.player-registrationpass
game.player-registration-is-idempotentpass
game.player-registered-oncepass
game.enemy-ai-createdpass
game.enemies-movepass
game.projectiles-firepass
game.hp-from-tablepass
game.damage-and-hud-eventpass
game.movement-from-tablepass
game.pool-reuses-projectilepass
game.pool-updates-ownerpass
game.pool-updates-rotationpass
game.hud-preserves-initial-damaged-healthpassinitial=0.93; current=0.93; displayed=0.93
game.hud-unsubscribes-previous-targetpassexpected=1; displayed=1
game.hud-resynchronizes-after-reactivationpassexpected=0.9; displayed=0.9
default-scene.missing-script-countpass0
default-scene.camerapass
default-scene.lightpass

테스트 자체의 안정화

최종화 과정에서 초기 체력 검사 1회가 실패했으나, 당시 현재 체력·표시값의 상세 값은 없어서 원인을 확정하지 않았습니다. 추적 재실행에서는 0.93 / 0.93 / 0.93으로 통과했습니다. 이후 검사 대상을 전투에서 격리하고 실제 두 프레임을 기다리도록 변경했습니다. 기존 HpBar 코드로는 0.93을 1로 표시하는 등 세 오류가 재현됐고, 수정본으로 동일 검사를 통과했습니다.

간헐적 실패 관측 기록 · 독립 검사의 기존 코드 실패. 이후 실행 기록은 history 폴더에 보존합니다.

C# 자동 회귀 검증

배포 패키지 빈 프로젝트 가져오기: 23개 통과 · 9개 언어 가이드·배포 파일 일치 검사 · 공식 Asset Store Tools 11.3.1: 28개 통과·경고 1개·실패 0개 · 제출 준비 점검

실제 Unity 검증 재실행

pwsh -File Tools/Verification/Unity/RunValidation.ps1

PowerShell 7과 설치된 Unity 6000.0.83f1, 로컬 UI·Sprite 패키지 캐시가 필요합니다. 원본 창을 종료하지 않고 별도 프로젝트를 준비해 실행합니다. 전체 검사 완료 기록과 프로세스 종료값을 확인하며 실패가 있으면 스크립트도 실패합니다. Unity 전체 로그는 임시 검증 폴더에 두고, 공유용 결과에는 JSONL만 사용합니다.

상태: pass · 확인된 assertion 수: 8226

dotnet run --project Tools/Verification/Verification.csproj --no-restore

전체 프로젝트 소스를 설치된 Unity 어셈블리에 대조해 컴파일합니다. XLSX 저장·복원, 수식, 상대·절대 참조, 복사·잘라내기, 떨어진 선택, 구조 변경, 필터·정렬, 행·열 크기·숨김, 틀 고정 좌표, 찾기·바꾸기·통계·연속 채우기·언어 테이블 등을 검사합니다. UI를 직접 클릭해 검증한 것으로 계산하지 않았습니다.

데이터 처리 성능

.NET 9 검증 프로그램의 단회 경과 시간입니다. 합성 데이터는 4개 열이며 행마다 수식 하나를 포함합니다. JIT·GC·캐시·동시 프로세스의 영향을 분리한 반복 통계가 아니며, Unity Mono·IL2CPP 성능이나 GUI FPS를 뜻하지 않습니다.
행 / 셀작업시간(ms)결과
1000 / 4000validate_and_build33.13127894 bytes
1000 / 4000find13.1251 matches
1000 / 4000selection_summary4.0211000 numeric cells
1000 / 4000diagnostics4.9680 issues
1000 / 4000sort_descending17.0041000 rows
1000 / 4000replace_all12.0581000 replacements
10000 / 40000validate_and_build59.396288894 bytes
10000 / 40000find57.2371 matches
10000 / 40000selection_summary29.99310000 numeric cells
10000 / 40000diagnostics63.8870 issues
10000 / 40000sort_descending167.60310000 rows
10000 / 40000replace_all155.30210000 replacements
50000 / 200000validate_and_build283.2801488894 bytes
50000 / 200000find238.2721 matches
50000 / 200000selection_summary168.29750000 numeric cells
50000 / 200000diagnostics203.1100 issues
50000 / 200000sort_descending715.60650000 rows
50000 / 200000replace_all645.61150000 replacements

실제 씬 렌더 캡처

Unity 카메라를 RenderTexture에 렌더한 이미지입니다. Overlay Canvas는 캡처 중에만 씬 카메라에 연결하고 복원했습니다. 창 전체의 운영체제 스크린샷으로 표현하지 않습니다.

상점 샘플 실제 Unity 렌더 캡처
상점 샘플
게임 샘플 실제 Unity 렌더 캡처
게임 샘플
기본 SampleScene 실제 Unity 렌더 캡처
기본 SampleScene

미완료·미검증 항목

편집기의 실제 클릭·키보드·드래그와 기능별 UI 스크린샷 촬영은 완료되지 않았습니다. 초기 창 캡처에서 본문이 검게 보였고, 복구 과정에서 포커스·캡처 작업이 과거 화면 비조작 요청을 근거로 자동 승인 검토에 의해 거부되었습니다. 이후 사용자가 클릭·입력·캡처를 명시적으로 허용했습니다. 재시도에서 기본 메뉴는 작동했지만 프레임 없는 자식 창의 입력 대상을 연결하지 못했습니다. 원인은 미확인입니다. 시도·오류·미검증 목록과 새 창 캡처를 보존했습니다.

초기 캡처 문제 원본

이 항목들은 자동 검증 통과 수에 포함해 완료 처리하지 않았습니다.

렌더링 옵션 참고: Unity 6.0 공식 명령줄 문서. 이 문서는 OpenGL 옵션의 존재를 뒷받침하며 검은 화면의 원인을 입증하지는 않습니다.